使用Integer.parseInt转换32位二进制字符串失败
为什么这部分代码会失败:
Integer.parseInt("11000000000000000000000000000000",2);Exception in thread "main" java.lang.NumberFormatException: For input string: "11000000000000000000000000000000"
据我了解,整数是32位值。上部代码中的零和一的数目为32。如果有31,则该代码有效。为什么呢?
回答:
您的代码失败,因为它尝试解析一个需要33位才能存储为有符号整数的数字。
有符号int
是二进制补码表示形式的32位值,其中第一位将指示数字的符号,其余31位将指示数字的值。(-ish。)Java仅支持带符号的整数,并且parseInt()
不应该和Friends
一起解析两个补码的位模式-
从而将右边第32位的1
or或(可能暗含)解释0
为符号。它们旨在支持解析人类可读的表示,这是符号的可选-
(或+
),后跟数字的绝对值。
在这种情况下,这是一种错误的直觉,导致您期望自己描述的行为:如果您要解析除2以外的
其他基数(或者可能是其他常用的2的幂次基数),您是否期望第一个数字为输入会影响符号吗?显然你不会;比如说,
按设计parseInt("2147483648")
返回的收益将使PHP疯狂。-2147483648
__
特殊的两重力基础也令人感到奇怪。最好有一种单独的方法来处理位模式,例如此答案中的一种。
以上是 使用Integer.parseInt转换32位二进制字符串失败 的全部内容, 来源链接: utcz.com/qa/413171.html