Integer.parseInt()不解析大的负数

时间:2011-03-30 16:02:52

标签: java

为什么在尝试Integer.parseInt("80000010", 16)时会抛出NumberFormatException?那个 IS 是一个32位的数字,这是java的int。

的大小

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

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

根据我的计算器打印-2147483632确实为0x80000010;)

6 个答案:

答案 0 :(得分:10)

因为parseInt“将字符串参数解析为有符号整数”,如API文档中所指定。带有基数16的值80000010超出了有符号32字节值的有效范围。

答案 1 :(得分:6)

你可以做到

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

<强>更新

使用Java 8 update(2014),您可以写

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

答案 2 :(得分:4)

80,00,00,10 16 = 2,147,483,664 10

虽然Java整数的范围是-2,147,483,648 10 到2,147,483,647 10

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

你用16进行解析。所以它大于整数的最大值。