2015-09-29 2 views
1
byte[] stuffA = {69,96,13,37,-69,-96,-13,-37}; 
    for(int x = 0; x < stuffA.length; x++){ 
     if(stuffA[x] < 0){ 
      System.out.println("Somethin be up yo! "); 
      System.out.println("This number be negative! " + (int)stuffA[x]); 
      stuffA[x] = (byte)((int)stuffA[x] + 256); 
      System.out.println("I added 256 and now stuff is positive yo! " + stuffA[x]); 
     } 
    } 
    return; 

Когда я запускаю это, мой вывод:Java - Не удается редактировать содержимое массива байтов?

Somethin be up yo! 
This number be negative! -69 
I added 256 and now stuff is positive yo! -69 
Somethin be up yo! 
This number be negative! -96 
I added 256 and now stuff is positive yo! -96 
Somethin be up yo! 
This number be negative! -13 
I added 256 and now stuff is positive yo! -13 
Somethin be up yo! 
This number be negative! -37 
I added 256 and now stuff is positive yo! -37 

Что происходит?

+1

Как вы думаете, диапазон значений, которые вы можете хранить в байтах? –

ответ

1

Цитирование Спецификация языка Java, раздел 4.2.1:

Значения целочисленных типов являются целыми числами в следующих диапазонах: Для byte, от -128 до 127 включительно.

Итак, -69 + 256 = 187 = 0x000000BB отбрасывается байт 0xBB = -69.

0

byte всего 8 бит, поэтому может содержать только 2^8 = 256 значений. Он заключен в java, поэтому значения находятся в диапазоне от [-128,127] включительно.

0

A byte может содержать 256 значений различных значений. Если вы добавите 256 байтовых переполнений, результат останется прежним. В java диапазон [-128, 127].

1

Байт имеет диапазон между -128 и 127 (от -2^7 до 2^7-1). Добавление 256-го значения, как поворот на 360 градусов. Измените 256 на 128 в вашем коде и введя разные результаты.

0

Байт может содержать 256 разных значений, поэтому при добавлении 256 вы делаете Rol (Rotate left) 8 times, что возвращает то же значение, что и предыдущее.

Если вы хотите преобразовать -69 в 69, почему вы просто не делаете stuffA[x] *=-1?

Если вы действительно хотите, чтобы полностью изменить биты, вы можете использовать complement operator (~) stuffA[x] = (byte) ~stuffA[x];, но из-за two's complement form, чтобы получить такое же количество, как Previos вам нужно add 1,

как stuffA[x] = (byte) ((~stuffA[x]) + 1);

0

байт 8 бит, а число 32 бита

в основном, глядя на биты:

байт б = -37 эквивалентно 219 (INT), чей двоичный:

0000 0000 0000 1101 1011 

INT 256:

0000 0000 0001 0000 0000 

добавления и даст значение INT 475:

0000 0000 0001 1101 1011 

Теперь преобразовать это байт, т.е.принимать LSB 8 бит будут:

1101 1011 

которого -37

Надеется, что это объясняет

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