Подтвердить что ты не робот

Сравнить байтовые значения?

Мне любопытно узнать, почему, когда я сравниваю массив byte со значением...

boolean match = ((data[0] & 0xFF) == 0xFE);

... возвращает true, а...

boolean match = (data[0] == 0xFE);

... нет? data - массив byte с

data[0] = (byte) 0xFE;
4b9b3361

Ответ 1

boolean match = ((data[0] & 0xFF) == 0xFE);

сравнивает целые числа, так как 0xFF является целым числом, это выражение будет увеличивать ваш байт data[0] до int и сравнивать то, что внутри скобки, со вторым int 0xFE(254). Как вы говорите, data[0] есть (byte)0xFE, сначала его масштабируют до целого числа 0xFE и сравнивают с целым числом 0xFE, поэтому это работает.

boolean match = (data[0] == 0xFE);

сравнивает байт с int 0xFE: 254

data[0] = (byte) 0xFE; 

является байтом (поэтому подписан), а его значение -2.

-2 не равен 254, поэтому вы должны сравнивать данные [0] в виде байта или масштабировать его до целого числа, прежде чем сравнивать его с целым числом 0xFE.

Более простым сравнением может быть

boolean match = (data[0] == (byte)0xFE);

Ответ 2

Я считаю, что это связано с продвижением 0xFF в int с расширением знака. В первом выражении 0xFE также продвигается к int, и поэтому результат data[0] & 0xFF также является int и выполняется сравнение int.

Но во втором примере кода операция не выполняется, и поэтому нет никакого продвижения к int. То есть, данные [0] не получают повышение до int, а 0xFE является int.