这个问题在这里已经有了答案:
8年前关闭。
在 C++ 98/03 中
5.6-4
在 C++ 11 中:
5.6 -4
如您所见,缺少符号位的实现定义,它会发生什么?
最佳答案
%
的行为在 C++11 中被收紧,现在完全指定(除了被 0
划分)。
向零截断和身份 (a/b)*b + a%b == a
的组合意味着 a%b
始终为正值 a
和负值 a
。
其数学原因如下:
设 ÷
为数学除法,/
为 C++ 除法。
对于任何 a 和 b,我们有 a÷b = a/b + f
(其中 f 是小数部分),并且根据标准,我们还有 (a/b)*b + a%b == a
。
已知 a/b
向 0
截断,所以我们知道如果 a÷b
为正,小数部分将始终为正,负为 0x2518122431343:a÷b
sign(f) == sign(a)*sign(b)
可以重新排列为 a÷b = a/b + f
。 a/b = a÷b - f
可以扩展为 a
:(a÷b)*b
=> (a/b)*b + a%b == a
。
现在左侧也可以展开:(a÷b - f)*b+a%b == (a÷b)*b
(a÷b)*b - f*b + a%b == (a÷b)*b
回想一下之前的 a%b == f*b
,所以:sign(f)==sign(a)*sign(b)
关于c++ - c++ 11中的运算符模更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13100711/