Java - Не удается изменить содержимое массива байтов?

    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;

Когда я запускаю это, мой вывод:

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

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


person Foo Bar    schedule 29.09.2015    source источник
comment
Как вы думаете, какой диапазон значений вы можете хранить в байте?   -  person Andy Turner    schedule 29.09.2015


Ответы (6)



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

person Armando SM    schedule 29.09.2015

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

person James Wierzba    schedule 29.09.2015

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

person AlexWien    schedule 29.09.2015

байт - 8 бит, а целое - 32 бита

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

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

0000 0000 0000 1101 1011

интервал 256:

0000 0000 0001 0000 0000

добавление обоих даст значение int 475:

0000 0000 0001 1101 1011

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

1101 1011

это -37

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

person abhish_gl    schedule 29.09.2015

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

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

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

нравится stuffA[x] = (byte) ((~stuffA[x]) + 1);

person Johnny Willer    schedule 29.09.2015