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