原因:
面试里涉及道一个题,就是只用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),
处理
- 先使用long 型来装,
- 如果增长超过了限定就抛出异常
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
}
看了下编译后文件,发现编译后,其实都是用的一种进制
编译后文件
网友评论