c模数算子

时间:2010-06-22 12:25:15

标签: c

使用%运算符时会发生什么情况。 例如-3%2或3%-2

5 个答案:

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