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

2019-04-18  本文已影响0人  VincentPeng

原因:

面试里涉及道一个题,就是只用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. 先使用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
    }

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


编译后文件
上一篇下一篇

猜你喜欢

热点阅读