让我们以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是符号位)。

我对此有错吗?

最佳答案

我对此有错吗?

是。 Javadoc没有说2的补码。实际上,它明确声明了它如何识别负值(即-前缀,因此有效地“人类可读”符号幅度)。

换种方式思考。如果parseByte将radix-2解释为2的补码,那么您希望它对radix-10(或者实际上是任何其他基数)做什么?为了保持一致性,必须为10的补码,这很不方便,我向您保证!

08-05 07:36