zoukankan      html  css  js  c++  java
  • Integer的最大值

    来自:https://blog.csdn.net/qq_33611068/article/details/77369050

    有这样一道题: 
    编程测试,遍历 0 到 int所能表示最大的正数,将消耗的时间打印。 
    下面是我的代码:

    1 int temp = 0;
    2 Date dt1 = new Date();
    3 long begintime = dt1.getTime();
    4 for(int i=0;i<=Integer.MAX_VALUE;i++){
    5     temp = i;
    6 }
    7 Date dt2 = new Date();
    8 long endtime = dt2.getTime();
    9 System.out.println(endtime - begintime);
     

    这段代码是会陷入死循环的,就死在了for里面。 
    刚开始的时候我还以为是这个数字太大了,一时半会儿遍历不到,我就将这个数字打印了一下:结果是2147483647。然后我就将代码中的Integer.MAX_VALUE逐步换成1000000,5000000,……,逐渐逼近这个数,等到换到21亿的时候,我发现还是可以快速执行完毕的。 
    然后我就怀疑是Integer.MAX__VALUE属性出现了某种问题,就将其换成了2147483647,还是死循环,看来怀疑错了,问题还是出现在这个数字身上。 
    这时候我再一次的检查了一次for循环,重点检查了终止条件,果然是这里出了问题,看我的for循环:

    for(int i=0;i<=Integer.MAX_VALUE;i++){
        temp = i;
    }

    只有当i比int最大值大的时候才能结束循环,可问题是…… 
    i本身就是int类型的,它怎么可能比int的最大值还大!!! 
    for循环运行到 i = Integer.MAX_VALUE ,即 i = 2147483647,i再加1,就变成了-2147483648

    (这个地方明白源码,反码,补码的同学已经懂了吧,不明白的等我详细的整理一个专题或者留言询问……请关注我) 
    这个负数与int最大值来比较,结果显然,要比最大值小,循环继续执行,重复这个过程,for循环永远都不会执行完毕。

  • 相关阅读:
    hdu 2203 亲和串
    hdu 3999 The order of a Tree
    poj 2299 Ultra-QuickSort
    hdu 1908 Double Queue
    hdu 1556 Color the ball
    hdu 4288 Coder
    hdu 5265 pog loves szh II
    hdu 5058 So easy
    T103763 【模板】矩阵乘法
    T103492 【模板】点双连通分量
  • 原文地址:https://www.cnblogs.com/heyboom/p/9083556.html
Copyright © 2011-2022 走看看