编程语言
首页 > 编程语言> > java – Wrapper的parseXXX()用于签名二进制误解

java – Wrapper的parseXXX()用于签名二进制误解

作者:互联网

我们以Byte.parseByte()为例,作为包装器的一个parseXXX().

parseByte(String s, int radix)'s JavaDoc开始:

Parses the string argument as a signed byte in the radix specified by
the second argument.

但是,如果radix = 2,则不完全正确.换句话说,-127的二进制文字是10000000:

byte b = (byte) 0b10000000;

所以以下情况应该是真的:

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

但不幸的是,它抛出NumberFormatException,而我必须按如下方式执行:

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

其中parseByte()将二进制字符串解析为符号幅度(符号和幅度),它应该解析为带符号的二进制(2的补码,即MSB是符号位).

我错了吗?

解决方法:

Am I wrong about this?

是. Javadoc对2的补码一无所知.实际上,它明确说明了它如何识别负值(即 – 前缀,因此有效地“人类可读”的符号幅度).

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

标签:java,parsing,binary,api-design
来源: https://codeday.me/bug/20190620/1245398.html