我正在使用 OpenJDK17,并且很困惑为什么
Integer.parseInt("10000000000000000000000000000000", 2)
会抛出 NumberFormatException
,因为它是 Integer.MIN_VALUE
的二进制表示形式(或十进制的 -2147483648
)。
这是预期的还是一些已知的边缘情况/怪癖?
我试图将 Java 的
Integer.MIN_VALUE
的二进制表示形式提供给 Integer.parseInt
,以便接收回来 -2147483648
,但内部却经历了 NumberFormatException
。
注意:我并没有特别尝试实现任何目标,只是在 JVM 上摆弄并遇到了这个。
以
Integer.parseInt()
为基数的 2
方法不用于将二进制补码整数值的位表示形式转换为 int
值。相反,它“只是”将字符串解析为具有给定基数的有符号整数。这意味着二进制的“10000000000000000000000000000000”在十进制中是2147483648。这么大的值在java中无法保存为int
,因为java中int
的最大值为2147483647(或Integer.MAX_VALUE
)。这就是为什么你会得到 NumberFormatException
。结果不会是您期望的 Integer.MIN_VALUE
那样的负值。仅当字符串中的第一个字符是 -
字符时,结果才会为负,如 Integer.parseInt()
的 javadoc 中所述:
[...] 除了第一个字符可以是 ASCII 减号“-”('\u002D') 来表示负值 [...]