为什么这个无限循环会聚?

时间:2014-12-07 06:57:45

标签: java math

为什么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);
}

3 个答案:

答案 0 :(得分:10)

由于整数溢出,此循环终止。当a达到int的最大值时,递增它会使其为负数。当b达到int的最小值时,递减它会使它成为一个大的正值。一旦其中一个溢出,循环终止。

由于初始值,a会首先溢出,因为两者都初始化为正值,因此aInteger.MAX_VALUE更接近b Integer.MIN_VALUE 1}}。

至于为什么输出-210

a递增(Integer.MAX_VALUE-100)+1次,直到循环终止为止 b减少了相同的次数。

最终aInteger.MIN_VALUE(由于溢出)
最终b110 - ((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。

链接到Java integer operations