Integer.parseInt()无法解析较大的负数。

3

当我尝试使用Integer.parseInt("80000010", 16)时,为什么会抛出NumberFormatException异常?? 这是一个32位数字,与Java的int类型大小相同。

编辑: 最好的部分是这个...

int z = 0x80000010;
System.err.println("equal to " + z);

打印出 -2147483632,根据我的计算器,这确实是 0x80000010


3
在我的宇宙里,80000010 不是负数。 - MusiGenesis
3
标题中写着“负数”,但示例给出的是正数。 - Paul Ruane
1
Java不支持无符号整数,这是它的一个“邪恶”之处。 - LiuYan 刘研
1
缺乏无符号类型可以很容易地解决。但我同意你不应该这样做。 ;) - Peter Lawrey
7个回答

10
因为在API文档中指定,parseInt将“将字符串参数解析为有符号整数”。 十六进制的值80000010超出了有符号32字节值的有效范围。

6

您可以做到

int value = (int) Long.parseLong("80000010", 16)

更新:

Java 8更新(2014)中,您可以编写以下内容:

int value = Integer.parseUnsignedInt("80000010", 16);

4

80,00,00,1016 等于 2,147,483,66410

Java整数的范围为-2,147,483,64810至2,147,483,64710


2

对于那些使用Java <= 7的人,Guava 提供了一个解析无符号整数的实用程序:

UnsignedInts.parseUnsignedInt("ffffffff", 16);
> -1

1

这是因为第一个参数是有符号整数,所以对于负数,您必须明确给出减号。而在您的情况下,您有一个超出整数范围的大的无符号数字。


1

你正在使用十六进制进行解析。因此它大于整数的最大值。


0

Integer.parseInt()接受一个带符号整数作为输入,这意味着输入必须在"7FFFFFFF""-80000000"之间。请注意0x80000000前的负号。对于-2147483632您想要的输入是正数2147483632 (0x7FFFFFF0)并在前面加上负号,因此使用Integer.parseInt("-7FFFFFF0", 16)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接