【发布时间】:2018-07-10 08:38:09
【问题描述】:
我发现以下行为令人惊讶:
int a = -2;
int b = 5;
uint c = 5;
std::cout << a%b << '\n';
std::cout << a%c << '\n';
Output:
-2
4
当涉及comparisons 时,混合有符号和无符号是有问题的 - 运算符% 中是否存在隐藏的比较,或者这里是否发生了其他事情?
【问题讨论】:
-
请注意,a%b 也可以是 3。它是实现定义的负数天气 % 具有正或负结果。
-
@GoswinvonBrederlow 自 C++11 起没有。
-
@GoswinvonBrederlow 见stackoverflow.com/a/12711070/1264299
-
该链接未提及天气/必须向 0 或向下舍入。引用的 C++11 部分只说
(a/b)*b + a%b is equal to a。至少过去 a / b 在不同的 CPU 上会以不同的方式舍入,并且标准允许这样做。然后 % 会更改以保留提到的相等性。 -
@GoswinvonBrederlow 当它说“对于整数操作数,/ 运算符产生代数商并丢弃任何小数部分”,我理解这意味着截断已完成 - 因此, “四舍五入”为零。