为什么Java中的代码输出值-210
,当它是无限循环时?
当整数达到最大值时,此循环是否结束?
public static void main(String[] args)
{
int a=100;
int b=110;
int c=0;
while(a>=100 && b<=110) {
a=a+1;
b=b-1;
c=a-b;
}
System.out.println(c);
}
答案 0 :(得分:10)
由于整数溢出,此循环终止。当a
达到int的最大值时,递增它会使其为负数。当b
达到int的最小值时,递减它会使它成为一个大的正值。一旦其中一个溢出,循环终止。
由于初始值,a
会首先溢出,因为两者都初始化为正值,因此a
比Integer.MAX_VALUE
更接近b
Integer.MIN_VALUE
1}}。
至于为什么输出-210
:
a
递增(Integer.MAX_VALUE-100)+1
次,直到循环终止为止
b
减少了相同的次数。
最终a
为Integer.MIN_VALUE
(由于溢出)
最终b
为110 - ((Integer.MAX_VALUE-100)+1) =
110 - ((-Integer.MIN_VALUE-1-100)+1) =
Integer.MIN_VALUE + 210
因此,a-b
最终成为Integer.MIN_VALUE - (Integer.MIN_VALUE + 210) = -210
答案 1 :(得分:3)
让我补充一下伊兰的回答。
变量a在到达INT_MAX时会回绕,当它达到INT_MAX的负数时也是如此。
哪一个首先达到极限?遗嘱。
然后a> = 100的条件将失败,因此循环将完成。
在循环结束时,b的值将为110 - (INT_MAX - 100)。
因此,c = a - b = -INT_MAX - (110 - (INT_MAX - 100))= 210;
答案 2 :(得分:0)
这正是发生的事情。一旦超过最大值,则while条件不再成立。
如果你要做这样的事情:
int a = 2147483647;
a = a + 1;
并打印出来,它会显示值-2147483648。