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; }