[英]what's wrong with this program
我有一个代码段:
class WhileTest
{
public static void main(String s[])
{
int x=12;
while(x<13)
{
x--;
}
System.out.println(x);
}
}
上面的程序的输出是: 2147483647
为什么这样?
x
递减,然后下溢达到Integer.MAX_VALUE
请注意,x = 12,并且您继续减去。 这将导致x 始终小于13。即直到发生Integer Overflow(x达到最低可能的int(Integer.MIN_VALUE)),并且该数字回绕为最大可能的整数(Integer.MAX_VALUE)为止。大于13,循环结束。
每次迭代都会减小x的大小,因此理论上x永远不会大于或等于13,对吧?
当然,如果int的行为就像整数一样。 但是他们没有。 Int具有最大和最小大小,因为它们在计算机中的存储方式。 在Java中,int是32位带符号的数字。 一个int的最大大小为2 ^ 31-1; 最小大小为-2 ^ 31。
如果x在该循环中为最小大小-2 ^ 31,会发生什么情况? -2 ^ 31-1 <13,为什么循环条件失败? 该数字不能用int表示。 整数的行为方式是它们环绕。
int x = Integer.MIN_VALUE; // x = -2^31
x--;
x == Integer.MAX_VALUE; //True. x == 2^31-1
2 ^ 21-1大于13,并且循环条件失败。 当x为Integer.MAX_VALUE时,运行print语句。 2 ^ 31-1的值是多少? 2147483647
int值转到Integer.MIN_VALUE,下溢并转到您正在查看的Integer.MAX_VALUE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.