c模数算子
使用%运算符时会发生什么情况。 例如-3%2或3%-2
在C89,C90和C ++ 03中,对于/
和%
运算符,标准仅要求(a/b)*b+a%b == a
。
如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是实现定义的
编辑:在C99中,如果第一个参数为负,则返回负数
在C99
-3%2=-1 3%-2=1
在C90
-3%2 or 3%-2
– >实施中定义
%
运算符给出整数除法的余数,因此(a / b) * b + (a % b)
总是等于a
(如果a / b
是可表示的;在二进制补码表示法中,最负整数除以-1不可代表)。
这意味着%
的行为与/
的行为相关联。 在C99之前,负操作数的舍入方向是实现定义的,这意味着负操作数的%
结果也是实现定义的。 在C99中, /
的舍入为零(小数位被简单地截断),这也修复了C99中%
的行为。
根据Kernighan&Ritchie的第2版,第39页,2.5:
…%的结果符号与负操作数的机器相关,上溢或下溢时采取的操作也是如此。
在C99中,%b具有a的符号,非常类似于math.h中的fmod。 这通常是你想要的:
unsigned mod10(int a) { int b = a % 10; return b < 0 ? b + 10 : b; }