是否保证(-x) % m
,其中x
和m
在c ++中是正数标准(c ++ 0x)为负且等于{{ 1}}?
我知道它在我认识的所有机器上都是正确的。
答案 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)
4)二进制/运算符产生商和二进制% 运算符从第一个除法中得到余数 表达由第二个。如果/或%的第二个操作数为零 行为未定义;否则(a / b)* b + a%b等于a。 如果 两个操作数都是非负的,其余的是非负的;如果 不,剩下的符号是实现定义的(强调我的)
这是来自C ++ 03。 :(