模数运算与负数
在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?
