2011-03-30 1066 views
3

为什么NumberFormatException抛出当我尝试Integer.parseInt("80000010", 16)?那IS一个32位的数字,这是java的int的大小。Integer.parseInt()不解析大的负数

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

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

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

+3

80000010在我的宇宙中不是一个负数。 – MusiGenesis 2011-03-30 16:04:26

+3

你在标题'负数'中说,但例子是一个正数。 – 2011-03-30 16:04:54

+1

Java不支持unsigned int是'邪恶的' – 2011-03-30 16:49:15

回答

6

你可以做

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

更新:

随着Java 8 update(2014),你可以写

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

因为parseInt函数“解析字符串参数作为有符号整数” ,如API文档中所指定的。基数为16的值80000010在签名的32字节值的有效范围之外。

1

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

1

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

4

80,00,00,10 = 2147483664

虽然一个Java整数具有2,147,483,647 的范围2,147,483,648 。

2

对于那些坚持使用Java < = 7,Guava提供了一个工具用于解析整数为 unsigned:

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