为什么这段代码导致NumberFormatException?

时间:2015-12-18 07:54:04

标签: java

我试图运行以下代码行:

 System.out.println("11111111111111111111111111111111 is " + Integer.parseInt("11111111111111111111111111111111", 2));

结果是:

java.lang.NumberFormatException: For input string: "11111111111111111111111111111111"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:495)

我希望它将该字符串解析为-1,因为当我执行以下操作时:

System.out.println(-1 + " is " + Integer.toBinaryString(-1));

我得到了输出:

-1 is 11111111111111111111111111111111

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

根据{{​​3}},

Integer.toBinaryStringint值视为无符号整数:

  

返回整数参数的字符串表示形式,作为base 2中的无符号整数。

     

如果参数为负,则无符号整数值为参数加2 32 ;否则它等于参数。该值转换为二进制(基数2)中的ASCII数字字符串,没有额外的前导0。

...而Integer.parseInt假设如果您想要一个负数,那么您在开始时会有一个负号。换句话说,这两个操作并不是彼此相反的。

现在,您可以通过将其解析为long(使用Long.parseLong(text, 2)然后将结果转发回int来获得您想要的内容。这可以在可以表示2 32 -1作为long,当你将其转换为int时,你将获得-1。

答案 1 :(得分:0)

如果您将11111111111111111111111111111111视为 Bits 的序列,它会转换为类似

的内容
1111 1111 - 1111 1111 - 1111 1111  - 1111 1111 

四个字节值' int',并且是-1的二进制表示

如果你使用Integer.parseInt()解析那么大的数字,那么这个数字(解释为基数10)就可以很长,以适应int。

使用Long.parseLong("", 2)你可以读取该位字符串 - 如果你将它转换回int,你的确会收回你的-1

int reverse = (int)Long.parseLong("11111111111111111111111111111111", 2)