20

是否保证C++标准(-x) % m(c++0x) 中的,​​ wherexmare positive是负数并且等于?-(x % m)

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

4

2 回答 2

11

In addition to Luchian's answer, this is the corresponding part from the C++11 standard:

The binary / operator yields the quotient, and the binary % operator yields the remainder from the division of the first expression by the second. If the second operand of / or % is zero the behavior is undefined. For integral operands the / operator yields the algebraic quotient with any fractional part discarded; if the quotient a/b is representable in the type of the result, (a/b)*b + a%b is equal to a.

Which misses the last sentence. So the part

(a/b)*b + a%b is equal to a

Is the only reference to rely on, and that implies that a % b will always have the sign of a, given the truncating behaviour of /. So if your implementation adheres to the C++11 standard in this regard, the sign and value of a modulo operation is indeed perfectly defined for negative operands.

于 2012-10-03T14:51:01.490 回答
7

5.6 乘法运算符

4) 二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义;否则 (a/b)*b + a%b 等于 a。如果两个操作数都是非负数,则余数是非负数;如果不是,则余数的符号是​​实现定义的(强调我的)

这是来自 C++03。:(

于 2012-10-03T14:41:31.690 回答