已经溢出时是否可以预测算术结果?

假设我们有,这int n = 2 ^ 31就是n-1 = 0111111111111111111111111111111我在本地可以得到的。


我的猜测:首先转换n为long-> 减法 -> 切片以适应int.


System.out.println(n);

System.out.println(Integer.toBinaryString(n-1) + " : " + Integer.bitCount(n-1));

System.out.println(n-1);



// output 


-2147483648

1111111111111111111111111111111 : 31

2147483647

但是我没有找到任何规范来验证我的猜测,有吗?


来自整数溢出维基。


当算术运算产生的结果大于上述 N 位整数的最大值时,溢出会将结果缩减为 2 的 N 次方模,仅保留结果的最低有效位并有效地导致回绕。


如果我的猜测完全错误,那么它实际上是如何工作的呢?我可以参考任何链接吗?


任何帮助将不胜感激 :)


泛舟湖上清波郎朗
浏览 119回答 1
1回答

翻过高山走不出你

这就是二进制补码算术的工作原理。根据 JLS §15.18.2 ,从 2^31 减去 1 与 2^31 加 -1相同,对于整数和浮点数减法,总是a-b会产生与 相同的结果a+(-b)。还有那个如果整数加法溢出,则结果是数学和的低位位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。现在我们可以用二进制计算 2^31 和 -1 的和。2^31 是一个 1 后跟 31 个零,即 -2147483648 的补码。-1 的补码是 32,所以我们有: 1000 0000 0000 0000 0000 0000 0000 0000+1111 1111 1111 1111 1111 1111 1111 1111如您所见,左边的最后一位溢出了,但根据第二个摘录,我们忽略了它。将所有这些相加,我们得到:0111 1111 1111 1111 1111 1111 1111 1111这是 2147483647
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java