2013-02-18 1 views
4

Давайте возьмем Byte.parseByte() в качестве примера в качестве одного из оберток parseXXX().ParseXXX Wrapper для подписанного двоичного недоразумения

От 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

Исследование: Вы посмотрели исходный код? – jlordo

+0

@jlordo Нет, у меня еще нет. –

+0

Сделайте это, вот как я понял всю эту проблему вчера перед публикацией [this] (http://stackoverflow.com/questions/14926920/java-long-parse-binary-string/14927505#14927505). – jlordo

ответ

4

Я не прав об этом?

Да. Джавадок ничего не говорит о 2'-дополнении. В самом деле, он явно указывает, как он распознает отрицательные значения (например, префикс -, так эффективно «удобочитаемый» знак-величина).

Подумайте об этом по-другому. Если parseByte интерпретировал radix-2 как 2's-дополнение, что бы вы хотели сделать для radix-10 (или, действительно, любого другого основания)? Для согласованности это должно было быть 10'-дополнением, что было бы неудобно, я могу заверить вас!

+0

+1 Они могут иметь if-инструкцию для 'radix = 2'. –

+0

Я также хотел бы отметить, что JavaDoc использует термин _signed byte_, чтобы подчеркнуть, что Java не знает беззнаковые байты. – jlordo

+0

@ Eng.Fouad: Они могли бы, но тогда это было бы (а) непоследовательным и (б) недокументированным;) –

1

Это происходит потому, что для parseByte «10000000» имеет положительное значение (128), которая не вписывается в байтовые значения в диапазоне от -128 до 128. Но мы можем разобрать comlement двоичного строковое представления двоичного с BigInteger:

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

это дает ожидаемый результат -128