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

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

Integer.parseInt("11000000000000000000000000000000",2);

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

据我所知,Integer是一个32位值。上部代码中的零和一的数量是32。如果有 31,则代码有效。为什么会这样?


答案 1

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

有符号是二进制补码表示形式的 32 位值,其中第一位将指示数字的符号,其余 31 位表示数字的值。(-ish.)Java只支持有符号整数,并且朋友不应该解析二的补码位模式 - 因此将右侧第32个位置的or(可能隐含)解释为符号。它们旨在支持解析人类可读的重现,这是符号的可选(或),后跟数字的绝对值。intparseInt()10-+

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

特殊外壳的两个电源底座也感觉很奇怪。最好使用单独的方法来处理位模式,例如此答案中的那个


答案 2

根据文档,整数的最大值是 。其中,在二进制中是:2^31-1

1111111111111111111111111111111

换句话说,连续31个。1