C ++运算符%保证

时间:2012-10-03 14:38:27

标签: c++ language-lawyer modulo

是否保证(-x) % m,其中xm在c ++中是正数标准(c ++ 0x)为负且等于{{ 1}}?

我知道它在我认识的所有机器上都是正确的。

2 个答案:

答案 0 :(得分:11)

除了 Luchian 的答案之外,这是C ++ 11标准的相应部分:

  

二进制/运算符产生商和二进制%运算符   从第一个表达式的除法得到余数   第二。如果/或%的第二个操作数为零,则行为为   未定义。对于积分操作数,/运算符产生代数   丢弃任何小数部分的商;如果商a / b是   在结果的类型中可表示,(a / b)* b + a%b等于a。

哪个错过了最后一句话。所以部分

  

(a / b)* b + a%b等于a

是唯一依赖的引用,这意味着a % b将始终具有a的符号,给定/的截断行为。因此,如果您的实现在这方面符合C ++ 11标准,那么模运算的符号和值确实完美地定义为负操作数。

答案 1 :(得分:7)

5.6乘法运算符

  

4)二进制/运算符产生商和二进制%   运算符从第一个除法中得到余数   表达由第二个。如果/或%的第二个操作数为零   行为未定义;否则(a / b)* b + a%b等于a。 如果   两个操作数都是非负的,其余的是非负的;如果   不,剩下的符号是实现定义的(强调我的)

这是来自C ++ 03。 :(