Java Integer.MAX_VALUE循环错误问题

今天看到一道题,是关于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这一结果。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值