Java - Integer.parseInt() не возвращает отрицательное число, если основание = 2

Насколько я знаю, при использовании дополнения 2 и первом числе 1, вы переворачиваете числа и находите значение нового байта и делаете его отрицательным. В javadoc говорится, что Integer.parseInt(String s, radix ) и Integer.valueOf(String s, radix) оба должны возвращать целочисленный объект со знаком, но когда я проверяю это следующим образом:

System.out.println(Integer.parseInt("10000001", 2));

System.out.println(Integer.valueOf("10000001", 2));

Я получил:

129

129

хотя мои расчеты дают мне -127. Что интересно, что

System.out.println(Integer.parseInt("-10000001", 2));

распечатывает:

-129

Кто-нибудь знает о другом методе Java, который, если вы введете байт (и основание = 2), метод вернет правильно подписанное значение?


person YazanLpizra    schedule 14.03.2013    source источник
comment
Может быть, потому что он возвращает int вместо byte?   -  person Mysticial    schedule 14.03.2013


Ответы (4)


Если это всегда будет байт, то это должно помочь:

int i = Integer.parseInt("10000001", 2);
byte b = (byte) i;

Целочисленное значение будет 129, но когда вы приведете его к байту, оно изменится на -127.

person leedsunited92    schedule 14.03.2013
comment
NumberFormatException: значение вне допустимого диапазона. Значение: 10000001 Основание: 2 - person ZhongYu; 14.03.2013
comment
Что не так с byte b = Byte.parseByte("10000001", 2);? - person jdb; 14.03.2013
comment
Насколько мне известно, метод parseByte предназначен только для байтов без знака, поэтому он считывает число как 129, что больше, чем может содержать байт, и поэтому будет выдано исключение NumberFormatException. - person leedsunited92; 14.03.2013
comment
Ваш код также читает его как 129, но он умещается в байте. Похоже, что parseByte ожидает строго математическое представление числа с отрицательным знаком «-». Знаковый бит — это компьютерная штука. Ваш ответ правильный. В любом случае JVM представляет байты как целые числа внутри. - person jdb; 14.03.2013

Итак, вы хотите

Integer.parseInt("1", 2) == -1?

Вы всегда можете проанализировать строку как 32-битное целое число, а затем, если значение равно 128-255, преобразовать его в отрицательное дополнение вручную.

person ZhongYu    schedule 14.03.2013
comment
нет, я ищу что-то вроде Integer.parseInt([8-bit number],2) = число с правильным знаком - person YazanLpizra; 14.03.2013
comment
Похоже на комментарий, а не на ответ. - person MrSmith42; 14.03.2013

Integer.parseInt(String s, целое основание)

Анализирует строковый аргумент как целое число со знаком в системе счисления, указанной вторым аргументом. Все символы в строке должны быть цифрами указанной системы счисления (в зависимости от того, возвращает ли функция Character.digit(char, int) неотрицательное значение), за исключением того, что первый символ может быть знаком минус ASCII '-' ('- ') для указания отрицательного значения. Возвращается результирующее целочисленное значение.

Таким образом, Integer.parseInt("anyvalue", 2) никогда не вернет значение -some, если только первый символ не равен "-".

person Achintya Jha    schedule 14.03.2013
comment
Если это не ваши собственные слова, вы должны указать, где вы их нашли. - person Ash Burlaczenko; 14.03.2013

Это связано с тем, что для int 10000001 не является -127, int имеет 32 бита, а это 31-й бит, который определяет, является ли число отрицательным или нет. Если мы думаем, что 10000001 равно -127, то это байт, а не целое число. Но Byte.parseByte("10000001", 2) не может проанализировать представление дополнения до двух и вызовет исключение NumberFormatException. Единственный способ проанализировать представление двух дополнений в Java SE - это

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

это даст ожидаемый -127

person Evgeniy Dorofeev    schedule 29.08.2013