String a = Integer.toHexString(-2147483646);
  得出 a = 80000002;
 int b = Integer.parseInt("80000002",16);
  运行这一句,却报错.
  为什么?请指教

解决方案 »

  1.   

    同意一楼的说法:16进制数80000002转换成10进制数是2147483650,超出了int的表示范围,
    long b = Long.parseLong("80000002", 16);
    System.out.println(b);
      

  2.   

    80000002是-2147483646的补码表示形式,而在字符串解析的时候 
    Integer.parseInt("80000002",16);这个方法始终把16进制字符串看成是正数的,如果你要解析一个16进制的负数,必须在前面加负号,如:parseInt("-FF", 16) 返回 -255
    所以在解析
    Integer.parseInt("80000002",16);是把80000002看作为一个正数,那么它的表示范围已经超过了int的表示范围,所以抛出异常;
    int b = Integer.parseInt("-7ffffffe", 16);
    System.out.println(b);//输出的值为-2147483646
      

  3.   

    parseInt
    public static int parseInt(String s,
                               int radix)
                        throws NumberFormatException使用第二个参数指定的基数,将字符串参数解析为有符号的整数。除了第一个字符可以是用来表示负值的 ASCII 减号 '-' ('\u002D’)外,字符串中的字符必须都是指定基数的数字(通过 Character.digit(char, int) 是否返回一个负值确定)。返回得到的整数值。 
    如果发生以下任意一种情况,则抛出一个 NumberFormatException 类型的异常: 第一个参数为 null 或一个长度为零的字符串。 
    基数小于 Character.MIN_RADIX 或者大于 Character.MAX_RADIX。 
    假如字符串的长度超过 1,那么除了第一个字符可以是减号 '-' ('u002D’) 外,字符串中的任何字符都不是指定基数的数字。 
    字符串表示的值不是 int 类型的值。 
    示例: parseInt("0", 10) 返回 0
    parseInt("473", 10) 返回 473
    parseInt("-0", 10) 返回 0
    parseInt("-FF", 16) 返回 -255
    parseInt("1100110", 2) 返回 102
    parseInt("2147483647", 10) 返回 2147483647
    parseInt("-2147483648", 10) 返回 -2147483648
    parseInt("2147483648", 10) 抛出 NumberFormatException
    parseInt("99", 8) 抛出 NumberFormatException
    parseInt("Kona", 10) 抛出 NumberFormatException
    parseInt("Kona", 27) 返回 411787参数:
    s - 包含要分析的整数表示形式的 String
    radix - 分析 s 时使用的基数。 
    返回:
    使用指定基数的字符串参数表示的整数。 
    抛出: 
    NumberFormatException - 如果 String 不包含可分析的 int。