Reputation: 47640
Is it guaranteed that in C++11, (-x) % m
is negative and equal to (-x % m)
, where x
and m
are positive?
I know it's right on all machines I know.
Upvotes: 20
Views: 1603
Reputation: 45948
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.
Upvotes: 11
Reputation: 258618
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. :(
Upvotes: 7