C++11是否保证余数的符号就是被除数的符号

Does C++11 guarantee that the sign of the remainder is the sign of the dividend?

本文关键字:符号 被除数 余数 是否 C++11      更新时间:2023-10-16

是否保证在C++11中,(-x) % m为负,等于(-x % m),其中xm为正?

我知道这在我认识的所有机器上都是正确的。

除了Luchian的答案外,这是C++11标准的相应部分:

二进制/运算符产生商,二进制%运算符从第一个表达式除以第二如果/或%的第二个操作数为零,则行为为未定义。对于积分操作数,/运算符产生代数丢弃任何分数部分的商;如果商a/b是可在结果类型中表示,(a/b)*b+a%b等于a。

它漏掉了最后一句话。所以部分

(a/b)*b+a%b等于

是唯一可依赖的引用,这意味着给定/的截断行为,a % b将始终具有a的符号。因此,如果您的实现在这方面遵循C++11标准,那么模运算的符号和值确实是为负操作数完美定义的。

5.6乘法运算符

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

不过这是来自C++03。:(