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

java如何处理整数溢出和下溢?,java,Java,我知道这是一个老问题,问了很多次。但我找不到任何令人满意的答案,因此再次询问。 有人能解释一下整数上溢和下溢的具体情况吗? 我听说有一些处理这个问题的“低阶字节”,有人能解释一下那是什么吗? 谢谢 你可以想象,当你只有2个位置时,你正在计数(因此每次加1) 但最后一个又被降到了“00”。这就是你的“溢出”。你00点回来。现在取决于位的含义,这可能意味着几件事,但大多数情况下,这意味着从最高值到最低值。(11至00) Mark peters在评论中添加了一个很好的例子:即使没有溢出,您也会遇到问题

我知道这是一个老问题,问了很多次。但我找不到任何令人满意的答案,因此再次询问。 有人能解释一下整数上溢和下溢的具体情况吗? 我听说有一些处理这个问题的“低阶字节”,有人能解释一下那是什么吗?


谢谢

你可以想象,当你只有2个位置时,你正在计数(因此每次加1)

但最后一个又被降到了“00”。这就是你的“溢出”。你00点回来。现在取决于位的含义,这可能意味着几件事,但大多数情况下,这意味着从最高值到最低值。(11至00)


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

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

这意味着溢出或下溢的位被简单地截断,Integer.MIN_值-1通常返回Integer.MAX_值


就“低阶字节”作为一种解决方法而言,它们实际上并非如此。当你用Java字节做算术运算时,它们被扩展成整数,算术运算通常在整数上执行,最终结果很可能完全包含在返回的字节中,因为它的存储容量远远大于起始字节。

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

因此:


打印两次true。

考虑java如何处理溢出/欠时钟的另一种方法是绘制一个异常时钟。你可以一次前进一个小时,但最终时间会重新开始。你可以把时钟倒回去,但一旦你超过了开始,你就又到了结尾。

Java对大多数整数类型都使用带符号的2的补码,所以通常是从-1到0。从最高值到最低值的过程是相同的,但是没有位溢出。当你从
0111
1000
时,例如,我不确定这是否能准确解释发生了什么。它确实解释了为什么操作“环绕”,但下溢/上溢在java案例中具有语义意义。在处理器中,这种情况也是“可检测的”,并且可以根据操作的需要以不同的方式处理(设置错误位等)。
 00
 01
 10
 11 
100
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);
System.out.println(Integer.MIN_VALUE - 1 == Integer.MAX_VALUE);