为什么整数.MAX_VALUE + 1 == Integer.MIN_VALUE?

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

是真的。

我知道Java中的整数是32位,不能超过231-1,但我不明白为什么在结果中添加1而不是某种异常。没有提到像透明转换为更大类型这样的东西,就像Ruby所做的那样。MAX_VALUEMIN_VALUE

此行为是否在某处指定?我可以依靠它吗?


答案 1

因为整数溢出。当它溢出时,下一个值为 。相关联合战略Integer.MIN_VALUE

如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。


答案 2

整数存储溢出,并且不会以任何方式指示,如 JSL 3rd Ed 中所述

内置整数运算符不以任何方式指示溢出或下溢。整数运算符可以引发需要空引用的 if 取消装箱转换 (§5.1.8)。除此之外,唯一可以引发异常 (§11) 的整数运算符是整数除法运算符 (§15.17.2) 和整数余数运算符 (§15.17.3),它们会引发 if 右侧操作数为零,以及递增和递减运算符 (§15.15.1, §15.15.2) 和 (§15.14.3§15.14.2),它们可以引发 if boxing 转换 (§5.1.7) 是必需的,并且没有足够的内存可用于执行转换。NullPointerException/%ArithmeticException++--OutOfMemoryError

4 位存储中的示例:

MAX_INT: 0111 (7)
MIN_INT: 1000 (-8)

MAX_INT + 1:

 0111+
 0001
 ----
 1000