为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

泛舟湖上清波郎朗 2022-11-30 16:47:16
假设我们有,这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 -21474836481111111111111111111111111111111 : 312147483647但是我没有找到任何规范来验证我的猜测,有吗?来自整数溢出维基。当算术运算产生的结果大于上述 N 位整数的最大值时,溢出会将结果缩减为 2 的 N 次方模,仅保留结果的最低有效位并有效地导致回绕。如果我的猜测完全错误,那么它实际上是如何工作的呢?我可以参考任何链接吗?任何帮助将不胜感激 :)
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

这就是二进制补码算术的工作原理。

根据 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


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 59 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信