2010-06-22 140 views
1

当您将负运算符与%一起使用时会发生什么情况。 例-3%2或3%-2c模数运算符

+3

刚刚试试? – Andrey 2010-06-22 12:31:27

+5

@Andrey:尝试不会告诉你绝对语言真实与你所看到的依赖于实现的区别。 – 2010-06-22 12:36:57

+0

正确的名称是“模数”或“余数”。 – lhf 2010-06-22 12:37:36

回答

2

在C89,C90和C++ 03标准仅要求(a/b)*b+a%b == a/%运算符。

如果两个操作数都是非负的,那么余数是非负的; 如果不是,则余数的符号是​​实现定义

编辑:在C99负数将如果第一参数为负

+0

在C99中,结果与股息具有相同的符号 – Satish 2010-06-22 12:38:26

1

%操作者给出了用于整数除法的余数,从而(a/b) * b + (a % b)返回总是等于a(如果a/b是可表示的;在二进制补码表示中,最大的负整数除以-1是不可表示的)。

这意味着%的行为耦合到/的行为。在C99之前,负操作数的舍入方向是实现定义的,这意味着负操作数的%的结果也是实现定义的。在C99中,对于/的舍入趋近于零(小数只是截断),这也修复了C99中的%的行为。

2

C99

-3%2=-1 
3%-2=1 

C90-3%2 or 3%-2 - >实现定义

0

在C99 A%B具有a的符号,很像在math.h中FMOD这往往是你想要什么:

unsigned mod10(int a) 
{ 
    int b = a % 10; 
    return b < 0 ? b + 10 : b; 
} 
1

根据Kernighan的&里奇,第2版,第39页,2.5:

......结果为%的符号是 机器相关的负 操作数,因为在 上采取的操作溢出或下溢。

+0

K&R是一本旧书,如果引用标准而不是引用K&R会更好。 – Satish 2010-06-22 12:42:58

+0

@Satish,我同意,这样会更好,但只要我知道标准是商业的,而且我没有它的副本。 Brian R. Bondy提供的答案是基于标准的,并且您已经完成了您的评论。 – pcent 2010-06-22 13:38:07