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