模运算a%b
返回a/b
的余数,但对于负数,它不会返回。{/ p>
#include <stdio.h>
int main(void) {
int n=-4;
printf("%d\n",n%3);
return 0;
}
它应返回2为3 *( - 2)= - 6小于-4且倍数为3但输出为-1。
为什么将(-a) mod b
视为-(a mod b)
答案 0 :(得分:5)
作为一般规则,模和除法应满足等式
b * (a/b) + a%b == a
对于正数,很明显这意味着a%b
必须是正数。但如果a/b
为负数,则结果将舍入为零。
例如, a = -4, b = 3.我们知道 a / b = -1.3333,向零舍入变为a/b == -1
。从上面的等式,我们得到b * (-1) + a%b == a
。如果我们插入a
和b
,我们会得到-3 + a%b == -4
,并且我们会看到a%b
必须为-1。
答案 1 :(得分:4)
你的痛苦源于拥抱%
是一个“模数”算子的错觉。事实上,它是一个余数运算符(C11§6.5.5):
/
运算符的结果是除法的商 第二个的第一个操作数;%
运算符的结果是 其余
拒绝幻觉并接受真相,操作员的行为将变得清晰(同上。):
如果商
a/b
可表示,则表达式(a/b)*b + a%b
应等于a
在您的情况下,a/b
为-4/3
,即-1
,因此可以代表。所以a%b
满足:
(a/b)*b + a%b = a
(-1)*3 + a%b = -4
-3 + a%b = -4
a%b = -1