C++ operator % guarantees

这一生的挚爱 提交于 2019-11-26 17:22:43

问题


Is it guaranteed that (-x) % m, where x and m are positive in c++ standard (c++0x) is negative and equals to -(x % m)?

I know it's right on all machines I know.


回答1:


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.




回答2:


5.6 Multiplicative operators

4) 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; otherwise (a/b)*b + a%b is equal to a. If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined (emphasis mine)

This is from C++03 though. :(



来源:https://stackoverflow.com/questions/12710801/c-operator-guarantees

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!