在Java中,为什么`Integer.parseInt("10000000000000000000000000000000"), 2)`会抛出NumberFormatException?

问题描述 投票:0回答:1

我正在使用 OpenJDK17,并且很困惑为什么

Integer.parseInt("10000000000000000000000000000000", 2)
会抛出
NumberFormatException
,因为它是
Integer.MIN_VALUE
的二进制表示形式(或十进制的
-2147483648
)。

这是预期的还是一些已知的边缘情况/怪癖?

我试图将 Java 的

Integer.MIN_VALUE
的二进制表示形式提供给
Integer.parseInt
,以便接收回来
-2147483648
,但内部却经历了
NumberFormatException

注意:我并没有特别尝试实现任何目标,只是在 JVM 上摆弄并遇到了这个。

java numberformatexception parseint
1个回答
2
投票

Integer.parseInt()
为基数的
2
方法不用于将二进制补码整数值的位表示形式转换为
int
值。相反,它“只是”将字符串解析为具有给定基数的有符号整数。这意味着二进制的“10000000000000000000000000000000”在十进制中是2147483648。这么大的值在java中无法保存为
int
,因为java中
int
的最大值为2147483647(或
Integer.MAX_VALUE
)。这就是为什么你会得到
NumberFormatException
。结果不会是您期望的
Integer.MIN_VALUE
那样的负值。仅当字符串中的第一个字符是
-
字符时,结果才会为负,如 Integer.parseInt()
javadoc 中所述:

[...] 除了第一个字符可以是 ASCII 减号“-”('\u002D') 来表示负值 [...]

© www.soinside.com 2019 - 2024. All rights reserved.