模数运算与负数

在ac程序中,我尝试了下面的操作(只是为了检查行为)

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

printf("%d ,%d ,%d", x, y, z); 

给我输出为(2, -2 , -2)在海湾合作委员会。 我每次都期待着一个积极的结果。 模数可以为负数吗? 任何人都可以解释这种行为吗?


C99要求当a/b可表示时:

(a/b) * b + a%b应等于a

这在逻辑上是有道理的。 对?

让我们看看这导致了什么:


例A.5 5/(-3)-1

=> (-1) * (-3) 5%(-3) + 5%(-3) = 5

这只有在5%(-3)为2时才会发生。


例B. (-5)/3-1

=> (-1) * 3 + (-5)%3 = -5

只有当(-5)%3-2才会发生这种情况


C中的%运算符不是模运算符,而是余数运算符。

模数和余数运算符在负值方面有所不同。

使用余数运算符时,结果的符号与红利的符号相同,而使用模运算符时结果的符号与除数相同。

C将a % b%操作定义为:

  a == (a / b * b) + a % b

/截断为0的整数除法。 这是对0进行截断(而不是向负无穷小),将%定义为余数运算符而不是模运算符。


基于C99规范: a = (a / b) * b + a % b

我们可以写一个函数来计算(a % b) = a - (a / b) * b

int remainder(int a, int b)
{
    return a - (a / b) * b;
}

对于模运算,我们可以有以下函数(假设b> 0)

int mod(int a, int b)
{
    int r = a % b;
    return r < 0 ? r + b : r;
}

我的结论是(a%b)在C中是余数运算符而不是模运算符。

链接地址: http://www.djcxy.com/p/58287.html

上一篇: Modulo operation with negative numbers

下一篇: Why do people say there is modulo bias when using a random number generator?