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