学习JAVA,我试图测试while
循环的上限,这会增加int
。请参阅下面的程序:
public class Test {
public static int a(){
int a = 10;
while(a > 9 )
++a;
return a;
}
public static void main(String[] argc) {
Test t = new Test();
int k = t.a();
System.out.println("k = "+(1 * k));
}
}
我知道32位的范围是从-2,147,483,648到2,147,483,647,所以基于此,我期待输出为2,147,483,647
,但我得到了:
k = -2147483648
我甚至尝试过
System.out.println("k = "+(1 * k/2));
但仍然输出:
k = -1073741824
问题:
为什么解决方案应该是积极的?
答案 0 :(得分:5)
您将a
int
增加1
,直至达到1 + Integer.MAX_VALUE
,这会将其值转移到-2147483648 == Integer.MIN_VALUE
。
这是你的循环评论:
// "infinite" loop as a is assigned value 10
while(a > 9)
// when a reaches Integer.MAX_VALUE, it is still incremented by 1
++a;
// loop condition now false, as value for a has shifted to -2147483648
return a;
答案 1 :(得分:2)
正在发生的事情被称为integer overflow。
二进制中的最大32位整数值是:
0111 1111 1111 1111 1111 1111 1111 1111
当你为这个数字加1时,你得到:
1000 0000 0000 0000 0000 0000 0000 0000
这是twos compliment或-2,147,483,648。由于任何负数小于9,while循环退出。
答案 2 :(得分:1)
<强> The operators that work on the int primitive value do not indicate overflow or underflow
强>
结果由 JVM 版本的语言和独立指定为:
Integer.MAX_VALUE + 1
is the same as
Integer.MIN_VALUE
Integer.MIN_VALUE - 1
is the same as
Integer.MAX_VALUE
答案 3 :(得分:1)
增加该值直到达到正限值并且它变为所有位但符号位变为1.
0x7FFFFFFF = 01111111 11111111 11111111 11111111
这是2147483647的二进制表示,即INT_MAX。当你再次增加一次时,它变为
0x80000000 = 10000000 00000000 00000000 00000000
等于INT_MIN,-2147483648。
现在,
2147483647大于9,因此循环继续。还有一个增量和oops,突然它是-2147483648,它小于9.这就是你的循环条件失败的地方。