我试图运行以下代码行:
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
这里发生了什么?
答案 0 :(得分:3)
Integer.toBinaryString
将int
值视为无符号整数:
返回整数参数的字符串表示形式,作为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)