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

Ali*_*ens 12 java integer 32-bit parseint numberformatexception

为什么这部分代码失败:

Integer.parseInt("11000000000000000000000000000000",2);

Exception in thread "main" java.lang.NumberFormatException: For input string: "11000000000000000000000000000000"
Run Code Online (Sandbox Code Playgroud)

据我所知,Integer是32位值.上面代码中的0和1的数量是32.如果有31个代码可以工作.为什么会这样?

mil*_*ose 16

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

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

在这种情况下,这是一种虚假的直觉,导致你期望你描述的行为:如果你正在解析除了基础2之外的任何其他基础(或者可能是其他常用的两个基数),你会期望第一个数字吗?影响标志的输入?显然你不会; 因此,按设计parseInt("2147483648")返回将是PHP级别的疯狂.-2147483648

特殊套管功率的两个基地也感觉很奇怪.最好有一个单独的方法来处理位模式,例如本答案中的方法.

  • Java表示**2的补码**中的整数,而不是符号幅度. (2认同)