黑马程序员技术交流社区

标题: Integer.parseInt("11111111111111111111111111111011",2)为何抛异常? [打印本页]

作者: 周兴中    时间: 2012-6-24 20:05
标题: Integer.parseInt("11111111111111111111111111111011",2)为何抛异常?
本帖最后由 周兴中 于 2012-6-24 21:18 编辑

Integer.toBinaryString(-5) 的结果为:11111111111111111111111111111011
反过来怎么会行不通呢?
Integer.parseInt("11111111111111111111111111111011",2)  //  已经表明前面这段String为2进制,Integer 在32位系统中 是由32位二进制组成,没有超出范围啊.
这个二进制转成十进制为什么会报NumberFormatException 数字格式异常?

就是说我转换负的二进制还得自己取反加1,然后再转换了.为什么会没有直接转的方法?




作者: 耿鑫    时间: 2012-6-24 20:17
本帖最后由 耿鑫 于 2012-6-24 20:25 编辑

哥们 !你这有点搞笑了,首先Integer.parseInt(String s, int radix)方法的参数是你要转换的数字的二进制字符串形式,“11111111111111111111111111111011”超出了int的范围,所以肯定会报错啊,你算算11111111111111111111111111111011换成十进制是个多大的数,超出范围了。
作者: 张立江    时间: 2012-6-24 20:26
parseInt(String s, int radix)方法
如果发生以下任意一种情况,则抛出一个 NumberFormatException 类型的异常:

1.第一个参数为 null 或一个长度为零的字符串。
2.基数小于 Character.MIN_RADIX 或者大于 Character.MAX_RADIX。
3.假如字符串的长度超过1,那么除了第一个字符可以是减号 '-' ('u002D’) 外,字符串中存在任意不是由指定基数的数字表示的字符。
4.字符串表示的值不是 int 类型的值。

你的问题就是第二点,
11111111111111111111111111111011转换成十进制就是4294967291,远远超出了int的范围,所以报出了异常,如果你想获得-5,你应该将1111 1111 1111 1111 1111 1111 1111 1011取反,得到
0000 0000 0000 0000 0000 0000 0000 0100,再加1得到
0000 0000 0000 0000 0000 0000 0000 0101,因为源码的第一位是1,表示负数,所以这个就是-5了.
作者: 谭立文    时间: 2012-6-24 21:27
public class Test {

    public static void main(String[] args)
    {  
            System.out.println("" + Integer.toBinaryString(-5));
            System.out.println("" + Long.parseLong("11111111111111111111111111111011", 2));
            System.out.println("" + Integer.parseInt("0101", 2));
    }

}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2