java如何处理整数溢出和下溢?

时间:2011-03-14 16:44:21

标签: java

我知道这是一个老问题,多次问道。但我无法找到任何令人满意的答案,因此再次提出要求。 有人可以解释在整数溢出和下溢的情况下究竟发生了什么? 我听说过处理这个问题的'低阶字节',有人能解释一下这是什么吗?

谢谢!

4 个答案:

答案 0 :(得分:8)

你可以想象,当你只有2个地方在计算时(每次增加1个)

 00
 01
 10
 11 
100

但最后一个又被削减到“00”。所以有你的“溢出”。你回到00.现在取决于比特的意思,这可能意味着几件事,但大多数时候这意味着你从最高值到最低值。 (11至00)

Mark peters在评论中添加了一个很好的内容:即使没有溢出,你也会遇到问题,因为第一位用作签名,所以你将从高到低而不会丢失。你可以说这个位与其他位“分开”

答案 1 :(得分:7)

Java将数字循环到最大或最小整数(取决于它是溢出还是下溢)。

所以:

System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);
System.out.println(Integer.MIN_VALUE - 1 == Integer.MAX_VALUE);

两次打印true。

答案 2 :(得分:2)

它基本上处理它们而不报告异常,执行2的补码运算而不考虑上溢或下溢,根据2的补码算法的机制返回预期的(但不正确的)结果。

这意味着上溢或下溢的位被简单地切断,而Integer.MIN_VALUE - 1通常返回Integer.MAX_VALUE。

至于“低阶字节”是一种解决方法,它们确实不是。使用Java字节进行算术时发生的事情是它们被扩展为int,算法通常在int上执行,最终结果可能完全包含在返回的内容中,因为它具有更多的存储容量而不是起始字节。

答案 3 :(得分:0)

另一种思考java如何处理溢出/下位的方法是描绘一个神学时钟。你可以一次向前移动一小时,但最终会再次开始。你可以向后收音,但是一旦你超越了开始,你就会再次结束。