java算法

java算法,java,math,integer-overflow,Java,Math,Integer Overflow,为什么此代码返回错误的值 int i=Integer.MAX_VALUE+1; long l=Integer.MAX_VALUE+1; System.out.println(l); System.out.println(i); 您试图存储此类型(2^31-1)无法表示的值,导致此处的32位整数类型溢出: 正如名字所说的Integer。MAX_VALUE是整数可用的最大值。在java中,当整数超过其最大值1(或溢出1)时,其值将是Integer.MIN\u value 如果整数加法溢出,则结果是

为什么此代码返回错误的值

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

您试图存储此类型(2^31-1)无法表示的值,导致此处的32位整数类型溢出:


正如名字所说的
Integer。MAX_VALUE
整数可用的最大值。在java中,当整数超过其最大值1(或溢出1)时,其值将是
Integer.MIN\u value

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

注意,如果使用Float或Double,则不会出现此溢出,值将为正无穷大

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


资源:


当您将1添加到
整数.MAX\u值时,它会溢出并环绕到
整数.MIN\u值

这是因为Java使用表示整数。4位的示例:

0000 : 0
0001 : 1
...
0111 : 7 (max value)
1000 : -8 (min value)
...
1110 : -2
1111 : -1
因此,当您将1添加到
0111
(最大值)时,它将转到
1000
,这是最小值。将这个概念扩展到32位,它的工作原理也是一样的


至于为什么
long
也显示了不正确的结果,这是因为它在
int
s上执行加法,然后隐式转换为
long
。您需要执行以下操作:

long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value

Java integer是32位有符号类型,范围从:-2147483648到2147483647


不能像在
i=integer.MAX_值+1中那样设置
i
integer变量

在这种情况下会发生什么:长l=整数。最大值+1;现在l是64位。请告诉我是否理解解析此代码虚拟机的算法:long l=Integer.MAX_VALUE+1;1.long l-我说虚拟机为这个变量分配64位内存。2.Integer.MAX_值+1-在这一行中,虚拟机对变量l一无所知。这里是一个简单的算术运算,其结果是一个整数溢出。3.在64位(l变量)的内存区域中,第二行写入的表达式结果-32位的值不正确。我发现第一步和第二步之间没有逻辑联系?它是真的吗?字节b1=100//字节b2=200;//可能丢失精度字节b3=100+1//字节b4=127+1;//可能的精度损失int i1=2000000000//int i2=299999999//整数太大:299999999整数i3=2000000000+1;int i4=2147483647+1;现在我不明白为什么会有不同类型的错误。对于b4变量-有错误,对于i4-无错误。
long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value