2013-05-27 4 views
7

Так как SE 7 Java позволяет указывать значения как двоичный литерал. Документация говорит мне, что «byte» - это тип, который может содержать 8 бит информации, значения от -128 до 127.Java-бинарные литералы - значение -128 для байта

Теперь я не знаю, почему, но я не могу определить 8 бит, но только 7, если я попытаюсь назначить двоичный код литерал байт в Java следующим образом:

byte b = 0b000_0000; //solves to the value 0 
byte b1 = 0b000_0001; //solves to the value 1 
byte b3 = 0b000_0010; //solves to the value 2 
byte b4 = 0b000_0011; //solves to the value 3  

И так далее, пока мы доберемся до последних нескольких possibilitys, используя эти 7 бит:

byte b5 = 0b011_1111; //solves to the value 63 
byte b6 = 0b111_1111; //solves to the value 127 

Если я хочу, чтобы сделать его отрицательные числа я должен добавьте вперед - вперед следующим образом:

byte b7 = -0b111_1111; //solves to the value -127 

Теперь половина проблемы, которую я имею, заключается в том, что я использую всего 7 бит для описания того, что они говорят мне, это 8-битный тип данных. Вторая половина состоит в том, что они, похоже, не являются потоковыми как дополнение к двум, если не использовать 32-битный тип int, где я могу определить все 32 бита (включая бит индикатора).

Теперь, когда я искать о том, как отобразить в зоне число -128 мне сказали, чтобы сделать это таким образом без каких-либо дальнейших объяснений:

byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000; 

я могу ясно видеть, что последние 8 бит (1000 0000) действительно представляют -128 в двойках compelment с использованием 8 бит, до сих пор я никогда не был смущен больше и попытаться задать свои вопросы:

  • Isnt выше 32 разрядное Н.Р. 32 Bit (ява) INT значение?
  • Почему я могу назначить 32-разрядное значение для 8-битного (java-) байтового типа?

Или вообще: Почему я должен назначить его таким образом?

Любые ссылки/информацию об этом было бы замечательно! Благодарим вас за то, что вы взяли, чтобы прочитать это, а также любую дополнительную информацию заранее.

С уважением Jan

+0

does 'byte b8 = 0b1000_0000' work, также искать двоичное представление 2-го дополнения –

+0

Нет байт b8 = 0b1000_0000 не работает, к сожалению, я потерял научную направленность на этот вопрос, но я думаю, что это, как ожидается, не сработает. Интересно, что на этот вопрос никогда не было полного ответа, нужно проверить, как установить вознаграждение. – JBA

ответ

8

Согласно спецификации Java,

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1

все ваши заявления (б, b1, ..., и b8) использовать INT литералов, даже когда они поместились в байт. В Java нет байтового литерала, вы можете использовать int только для инициализации байта.

Я сделал несколько тестов и byte neg128 = -0b1000_0000; работает отлично. 0b1000_0000 - 128, поэтому вам просто нужно поставить перед ним знак -. Обратите внимание, что 1не является знаковым битом (не думайте о 8-битных байтах, думайте о 32-битных ints, преобразованных в байты). Поэтому, если вы хотите указать бит знака, вам нужно записать все 32 бита, как вы продемонстрировали.

So byte b8 = 0b1000_0000; - это ошибка, аналогичная byte b8 = 128; - это ошибка (+128 не помещается в байт).Вы также можете заставить преобразование с броском:

byte b = (byte) 0b1000_0000; или byte b = (byte) 128;

Актерские сообщает компилятор, что вы знаете, 128 не помещаются в байтах и ​​будет переосмыслили в качестве -128 битового шаблона.

+0

О, я тоже был несколько удивлен тем, что в этом случае 0b1000_0000 не будет автоматически расширена подпиской. :-) – marcus

Смежные вопросы