3

为什么这段代码返回错误的值?

int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
4

4 回答 4

9

当您向其添加 1 时,Integer.MAX_VALUE它会溢出并环绕到Integer.MIN_VALUE.

发生这种情况是因为 Java 使用二进制补码来表示整数。4位示例:

0000 : 0
0001 : 1
...
0111 : 7 (max value)
1000 : -8 (min value)
...
1110 : -2
1111 : -1

因此,当您将 1 添加到0111(max) 时,它会变为1000,这是最小值。将此想法扩展到 32 位,它的工作方式相同。


至于为什么 yourlong也显示不正确的结果,那是因为它在ints 上执行加法,然后隐式转换为long. 你需要做:

long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value
于 2010-10-09T16:30:44.643 回答
3

顾名思义,Integer.MAX_VALUE是可用于 的最大值Integer。在 java 中,当一个整数超过其最大值 1(或溢出 1)时,其值为Integer.MIN_VALUE.

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

当心,使用 Float 或 Double 你不会有这个溢出,值将是POSITIVE_INFINITY

上溢运算产生有符号无穷大,下溢运算产生非规格化值或有符号零,而没有数学确定结果的运算产生 NaN。


资源 :

于 2010-10-09T16:29:16.267 回答
2

通过尝试存储此类型无法表示的值 (2^31 - 1),您在此处溢出了 32 位整数类型:

int i = Integer.MAX_VALUE + 1;
于 2010-10-09T16:27:55.203 回答
0

Java 整数是 32 位有符号类型,范围从:-2,147,483,648 到 2,147,483,647。

您不能i像在i=Integer.MAX_VALUE+1;

于 2010-10-09T16:31:24.940 回答