为什么这段代码返回错误的值?
int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
为什么这段代码返回错误的值?
int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
当您向其添加 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
也显示不正确的结果,那是因为它在int
s 上执行加法,然后隐式转换为long
. 你需要做:
long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value
顾名思义,Integer.MAX_VALUE
是可用于 的最大值Integer
。在 java 中,当一个整数超过其最大值 1(或溢出 1)时,其值为Integer.MIN_VALUE
.
如果整数加法溢出,则结果是数学和的低位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。
当心,使用 Float 或 Double 你不会有这个溢出,值将是POSITIVE_INFINITY
上溢运算产生有符号无穷大,下溢运算产生非规格化值或有符号零,而没有数学确定结果的运算产生 NaN。
资源 :
通过尝试存储此类型无法表示的值 (2^31 - 1),您在此处溢出了 32 位整数类型:
int i = Integer.MAX_VALUE + 1;
Java 整数是 32 位有符号类型,范围从:-2,147,483,648 到 2,147,483,647。
您不能i
像在i=Integer.MAX_VALUE+1;