美文网首页
记一次考虑int的取值范围的问题

记一次考虑int的取值范围的问题

作者: VincentPeng | 来源:发表于2019-04-18 17:53 被阅读0次

    原因:

    面试里涉及道一个题,就是只用string里的api,把字符串转成int值。
    核心方法是,利用'0'~'9'字符的ASCII值取处理,'9'的ASCII的值-‘0’的就是int 9.
    这些都不是今天关注的关键,今天关注的关键是其中关于转换如果超出int的存储范围怎么判断;

    char a = strarr[i]
    if (a>'0' && a<'9') {
    //这里只能判断单个字符是不是属于数字,总体长度和存储范围无法保障4
    // ‘0’ 是48
    }
    

    回顾一下基础

    • 1字节Byte等于8bit 8位二进制数
    • int 使用4个字节来表示的,等于使用了32位二进制数
    • 十六进制数用二进制表示需要使用4位二进制数 Oxf = 1111 (十进制上都是15),

    处理

    1. 先使用long 型来装,
    2. 如果增长超过了限定就抛出异常
    long num = 0;
    for (int i = 0 ;i < arr.length();i++) {
    //每次左移一位;补一位
    num = 10*num + arr[i] - '0'
    // 处理存储范围超限
        if ( num < 0x80000000 || num >0x7fffffff){
        //抛出超出存储范围异常
        }
    }
    

    0x80000000 就是16进制表示下的int最小值:换成二进制是,除了第一位是1之外,其他都是0的32位二进制数据
    0x7fffffff 就是16进制表示下的int最大值,换成二进制是除了前四位是0111,其余每个四位都为1111的32位二进制数据

        public static void main(String[] args) {
           int a =  ( int)0xffffffff;
               a = 0x7fffffff;
          int b =  0x80000000;// -2147483648
               b =  0x80000001;    //-2147483647
          int c = 0xf;//c = 15
           System.out.println(a);
           System.out.println("b = " + b);
            System.out.println("c = " + c);
            System.out.println( (int)'0');//48
        }
    

    看了下编译后文件,发现编译后,其实都是用的一种进制


    编译后文件

    相关文章

      网友评论

          本文标题:记一次考虑int的取值范围的问题

          本文链接:https://www.haomeiwen.com/subject/htgtgqtx.html