Несмотря на то, что уже слишком поздно, я хотел бы высказать свое мнение по этому поводу, поскольку это может прояснить, почему решение, данное JB Nizet, работает. Я наткнулся на эту небольшую проблему, работая над синтаксическим анализатором байтов и преобразованием строк сам. Когда вы копируете интегральный тип большего размера в интегральный тип меньшего размера, как говорится в этом java-документе, это происходит:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
Сужающее преобразование целого числа со знаком в целочисленный тип T просто отбрасывает все, кроме n наименьшего порядка битов, где n - количество битов, используемых для представления типа T. Помимо возможной потери информации о величине числового значения, это может привести к тому, что знак результирующего значения будет отличаться от знака входного значения. .
Вы можете быть уверены, что байт является интегральным типом, как говорится в этом java-документе
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
byte: байтовый тип данных - это 8-битные подписанные два дополнять целое число.
Таким образом, в случае преобразования целого числа (32 бита) в байт (8 бит) вы просто копируете последние (наименее значимые 8 бит) этого целого числа в заданную байтовую переменную.
int a = 128;
byte b = (byte)a;
System.out.println(b);
Вторая часть истории касается того, как унарные и бинарные операторы Java продвигают операнды.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
Расширяющееся примитивное преобразование (§5.1.2) применяется для преобразования одного или обоих операндов, как указано по следующим правилам:
Если один из операндов имеет тип double, другой преобразуется в double.
В противном случае, если один из операндов имеет тип float, другой преобразуется в float.
В противном случае, если один из операндов имеет тип long, другой преобразуется в long.
В противном случае оба операнда преобразуются в тип int.
Будьте уверены, если вы работаете с целым типом int и / или ниже, он будет повышен до int.
a = b & 0xFF;
System.out.println(a);
Я тоже почесал в затылке :). Здесь есть хороший ответ rgettman.
Побитовые операторы в Java только для целых и длинных?