4

让我们以Byte.parseByte()包装器之一为例parseXXX()

来自parseByte(String s, int radix)'s JavaDoc

将字符串参数解析为第二个参数指定的基数中的有符号字节。

但如果radix = 2. 换句话说,的二进制文字-12710000000

byte b = (byte) 0b10000000;

所以以下应该是正确的:

byte b = Byte.parseByte("10000000", 2);

但不幸的是,它会抛出NumberFormatException,而我必须这样做:

byte b = Byte.parseByte("-111111", 2);

whereparseByte()将二进制字符串解析为符号大小(符号和大小),它应该解析为有符号二进制(2 的补码,即 MSB 是符号位)。

我错了吗?

4

2 回答 2

4

我错了吗?

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

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

于 2013-02-18T13:54:28.853 回答
1

这是因为对于 parseByte,“10000000”是一个正值 (128),它不适合 -128 到 128 的字节值范围。但是我们可以使用 BigInteger 解析二进制补码表示:

byte b = new BigInteger("10000000", 2).byteValue()

这给出了预期的-128结果

于 2013-08-29T10:49:48.017 回答