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

原因:

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

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


编译后文件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容