小编典典

使用Integer.parseInt转换32位二进制字符串失败

java

为什么这部分代码会失败:

Integer.parseInt("11000000000000000000000000000000",2);

Exception in thread "main" java.lang.NumberFormatException: For input string: "11000000000000000000000000000000"

据我了解,整数是32位值。上部代码中的零和一的数目为32。如果有31,则该代码有效。为什么呢?


阅读 573

收藏
2020-09-28

共1个答案

小编典典

您的代码失败,因为它尝试解析一个需要33位才能存储为有符号整数的数字。

有符号int是二进制补码表示形式的32位值,其中第一位将指示数字的符号,其余31位将指示数字的值。(-ish。)Java仅支持带符号的整数,并且parseInt()不应该和Friends
一起解析两个补码的位模式-
从而将右边第32位的1or或(可能暗含)解释0为符号。它们旨在支持解析人类可读的表示,这是符号的可选-(或+),后跟数字的绝对值。

在这种情况下,这是一种错误的直觉,导致您期望自己描述的行为:如果您要解析除2以外的 任何
其他基数(或者可能是其他常用的2的幂次基数),您是否期望第一个数字为输入会影响符号吗?显然你不会;比如说,
按设计parseInt("2147483648")返回的收益将使PHP疯狂。-2147483648 __

特殊的两重力基础也令人感到奇怪。最好有一种单独的方法来处理位模式,例如此答案中的一种。

2020-09-28