这个问题在这里已经有了答案:




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/b0 截断,所以我们知道如果 a÷b 为正,小数部分将始终为正,负为 0x2518122431343:
a÷bsign(f) == sign(a)*sign(b) 可以重新排列为 a÷b = a/b + fa/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/

10-13 07:40