我们以Byte.parseByte()
为例,作为其中一个包装“parseXXX()
。
来自parseByte(String s, int radix)'s JavaDoc
:
将字符串参数解析为指定的基数中的带符号字节 第二个论点。
但如果radix = 2
那就不太正确了。换句话说,-127
的二进制文字是10000000
:
byte b = (byte) 0b10000000;
所以以下情况应该是真的:
byte b = Byte.parseByte("10000000", 2);
但不幸的是,它会抛出NumberFormatException
,而我必须按照以下方式执行:
byte b = Byte.parseByte("-111111", 2);
其中parseByte()
将二进制字符串解析为符号幅度(符号和幅度),它应该解析为带符号的二进制(2的补码,即MSB是符号位)。
我错了吗?
答案 0 :(得分:4)
我错了吗?
是。 Javadoc对2的补码一无所知。实际上,它明确说明了它如何识别负值(即-
前缀,因此实际上是“人类可读的”符号量级。)
以另一种方式思考。如果parseByte
将radix-2解释为2的补码,那么你希望它对radix-10(或者其他任何基数)做什么?为了保持一致性,它必须是10的补码,这是不方便的,我可以向你保证!
答案 1 :(得分:1)
这是因为parseByte“10000000”是一个正值(128),它不适合字节值-128到128.但是我们可以用BigInteger解析两个二进制字符串表示法:
byte b = new BigInteger("10000000", 2).byteValue()
这给出了预期的-128结果