Java 整数.parseInt()不';t解析大负数

Java 整数.parseInt()不';t解析大负数,java,Java,为什么在我尝试Integer.parseInt(“8000010”,16)时会抛出NumberFormatException??这是一个32位的数字,它是java的int的大小 编辑: 最棒的是 int z = 0x80000010; System.err.println("equal to " + z); 打印-2147483632,根据我的计算器,这确实是0x8000010) 因为parseInt“将字符串参数解析为有符号整数”,如API文档中所指定。基数为16的值8000010超出有符号

为什么在我尝试
Integer.parseInt(“8000010”,16)
时会抛出NumberFormatException??这是一个32位的数字,它是java的int的大小

编辑: 最棒的是

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

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

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

这是因为第一个参数是有符号整数,所以对于负数,必须显式地给出减号。在你的例子中,你有一个大的未编码的数字在整数范围之外。

你用基数16解析它。因此它大于整数的最大值。

80,00,001016=214748366410

而Java整数的范围为-214748364810到214748364710。

您可以

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

有了(2014)你就可以写作了

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

对于那些坚持使用Java 80000010的人来说,在我的世界里,80000010不是一个负数。你在标题“负数”中说,但这个例子是一个正数。Java不支持无符号intA,这是一个“邪恶”的东西。缺少无符号intA很容易解决。但我同意你不应该这样做
UnsignedInts.parseUnsignedInt("ffffffff", 16);
> -1