是否保证在C++11中,
(-x) % m
为负且等于(-x % m)
,其中x
和m
为正?
我知道它在我知道的所有机器上都是正确的。
除了Luchian的答案之外,这是C++11标准中的相应部分:
二元 / 运算符产生商,二元 % 运算符产生商 产生第一个表达式除以的余数 第二。如果 / 或 % 的第二个操作数为零,则行为为 不明确的。对于整数操作数 / 运算符产生代数 商与任何小数部分被丢弃;如果商 a/b 是 以结果类型表示,(a/b)*b + a%b 等于 a。
漏掉了最后一句话。所以这部分
(a/b)*b + a%b 等于 a
是唯一依赖的参考,这意味着考虑到
a % b
的截断行为,a
将始终具有 /
的符号。因此,如果您的实现在这方面遵循 C++11 标准,则模运算的符号和值确实是为负操作数完美定义的。
4) 二元 / 运算符产生商,而二元 % 运算符产生第一个除法的余数 由第二个表达。如果 / 或 % 的第二个操作数为零 行为未定义;否则 (a/b)*b + a%b 等于 a。 如果 两个操作数均为非负,则余数为非负;如果 不是,余数的符号是实现定义的(强调我的)
这是来自 C++03 的。 :(