Modulo operation with negative numbers

前端 未结 12 1537
旧巷少年郎
旧巷少年郎 2020-11-22 06:10

In a C program i was trying the below operations(Just to check the behavior )

 x = 5 % (-3);
 y = (-5) % (3);
 z = (-5) % (-3); 

printf(\"%d ,%d ,%d\", x, y         


        
12条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 06:47

    Can a modulus be negative?

    % can be negative as it is the remainder operator, the remainder after division, not after Euclidean_division. Since C99 the result may be 0, negative or positive.

     // a % b
     7 %  3 -->  1  
     7 % -3 -->  1  
    -7 %  3 --> -1  
    -7 % -3 --> -1  
    

    The modulo OP wanted is a classic Euclidean modulo, not %.

    I was expecting a positive result every time.

    To perform a Euclidean modulo that is well defined whenever a/b is defined, a,b are of any sign and the result is never negative:

    int modulo_Euclidean(int a, int b) {
      int m = a % b;
      if (m < 0) {
        // m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
        m = (b < 0) ? m - b : m + b;
      }
      return m;
    }
    
    modulo_Euclidean( 7,  3) -->  1  
    modulo_Euclidean( 7, -3) -->  1  
    modulo_Euclidean(-7,  3) -->  2  
    modulo_Euclidean(-7, -3) -->  2   
    

提交回复
热议问题