Как вы видите, результат int
не байт
Как это работает, скажем, у нас есть byte b = -128;
, это представляется как 1000 0000
, так что происходит, когда вы выполняете свою строку?Давайте для этого воспользуемся временным int, скажем:
int i1 = (int)b;
i1 теперь равен -128, и это фактически представлено в двоичном виде следующим образом:
1111 1111 1111 1111 1111 1111 1000 0000
Так как же i1 & 0xFF
выглядит в двоичном виде?
1111 1111 1111 1111 1111 1111 1000 0000
&
0000 0000 0000 0000 0000 0000 1111 1111
, что приводит к
0000 0000 0000 0000 0000 0000 1000 0000
, и это ровно 128, что означает, что ваше значение со знаком преобразовано в беззнаковое.
Редактировать
Преобразовать байт -128 .. 127
в 0 .. 255
int unsignedByte = 128 + yourByte;
Вы не можете представлять значения от 128 до 255 с помощью байта, вы должны использовать что-то еще, например, int или smallint.