C++11能保证余数的符号就是被除数的符号吗?

问题描述 投票:0回答:2

是否保证在C++11中,

(-x) % m
为负且等于
(-x % m)
,其中
x
m
为正?

我知道它在我知道的所有机器上都是正确的。

c++ c++11 language-lawyer modulo
2个回答
11
投票

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

二元 / 运算符产生商,二元 % 运算符产生商 产生第一个表达式除以的余数 第二。如果 / 或 % 的第二个操作数为零,则行为为 不明确的。对于整数操作数 / 运算符产生代数 商与任何小数部分被丢弃;如果商 a/b 是 以结果类型表示,(a/b)*b + a%b 等于 a。

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

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

是唯一依赖的参考,这意味着考虑到

a % b
的截断行为,
a
将始终具有
/
的符号。因此,如果您的实现在这方面遵循 C++11 标准,则模运算的符号和值确实是为负操作数完美定义的。


7
投票

5.6 乘法运算符

4) 二元 / 运算符产生商,而二元 % 运算符产生第一个除法的余数 由第二个表达。如果 / 或 % 的第二个操作数为零 行为未定义;否则 (a/b)*b + a%b 等于 a。 如果 两个操作数均为非负,则余数为非负;如果 不是,余数的符号是实现定义的(强调我的)

这是来自 C++03 的。 :(

© www.soinside.com 2019 - 2024. All rights reserved.