2011-03-30 21 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