今天看到一道题,是关于int最大值的循环问题,如下图
public static final int e1 = Integer.MAX_VALUE;
public static final int e2 = e1 - 2;
public static void main(String[] args) {
int count = 0;
System.out.println(e1);
System.out.println(e2);
for(int i = e2; i <= e1; i++){
count++;
}
System.out.println(count);
}
开始我没发现有什么错误,然后实际运行了一下才发现这个循环是个死循环,代码所表达的意思就是当i大于int的最大值时退出循环。
之后我通过调试发现,int的最大值是2147483647,i也确实可以循环到这个值,但是在“最后一次循环”中,也就是i++之后i的值变为了-2147483648,变成了int的最小值,所以退出循环的条件不满足,变成了死循环。
为什么会这样呢?
查阅了之前学的关于计算机组成原理的书籍后,我明白了
java的ingteger类型在底层使用的补码,补码的形式是数位第一位是符号位(0表示正,1表示负),其余位数表示这个数的大小。int类型的最大值是2147483647,用补码表示就是01111111 111111111111111111111111,其中的0表示这个数是个正数,并不作为实际数值使用,其余数位的1是用来表示数的大小的。
当我们在i++之后,补码的值变为了10000000 00000000 00000000 00000000,这时最高位是1,表示这是一个负数,并且其余位数全部为0,表示这是一个最小的负数,也就是int类型的最小值。所以才会有2147483647+1=-2147483648这一结果。