int类型的意外输出

时间:2014-08-21 12:55:29

标签: java int size

学习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

问题:

为什么解决方案应该是积极的?

4 个答案:

答案 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)

如果我们看一下Oracle docs on int values我们可以找到:

<强> 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.这就是你的循环条件失败的地方。