Chociaż jest już za późno, chciałbym wnieść swój wkład w tę sprawę, ponieważ może to wyjaśnić, dlaczego rozwiązanie podane przez JB Nizet działa. Natknąłem się na ten mały problem podczas pracy z parserem bajtów i samodzielną konwersją ciągów. Podczas kopiowania z typu całkowitego o większym rozmiarze do typu całkowitego o mniejszym rozmiarze, zgodnie z tym, co mówi ten dokument java:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
Zwężająca się konwersja liczby całkowitej ze znakiem na typ całkowy T po prostu odrzuca wszystko oprócz n najniższego bitów porządkowych, gdzie n to liczba bitów użytych do reprezentacji typu T. Oprócz możliwej utraty informacji o wielkości wartości liczbowej może to spowodować, że znak wartości wynikowej będzie różny od znaku wartości wejściowej .
Możesz być pewien, że bajt jest typem całkowitym, zgodnie z tym dokumentem java
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
bajt: Typ danych bajtowych to 8-bitowe podpisane dwa uzupełnienie liczby całkowitej.
Tak więc w przypadku rzutowania liczby całkowitej (32 bity) na bajt (8 bitów) wystarczy skopiować ostatnie (najmniej znaczące 8 bitów) tej liczby całkowitej do podanej zmiennej bajtowej.
int a = 128;
byte b = (byte)a;
System.out.println(b);
Druga część historii dotyczy sposobu, w jaki operandy jednoargumentowe i binarne Java promują operandy.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
Konwersja prymitywów poszerzających (§5.1.2) jest stosowana do konwersji jednego lub obu operandów zgodnie z opisem według następujących zasad:
Jeśli jeden z operandów jest typu double, drugi jest konwertowany na double.
W przeciwnym razie, jeśli jeden z operandów jest typu float, drugi jest konwertowany na float.
W przeciwnym razie, jeśli jeden z operandów jest typu long, drugi jest konwertowany na long.
W przeciwnym razie oba operandy są konwertowane na typ int.
Zapewniamy, że jeśli pracujesz z typem całkowitym int i / lub niższym, zostanie on podwyższony do typu int.
a = b & 0xFF;
System.out.println(a);
Ja też podrapałem się po głowie :). Rgettman ma na to dobrą odpowiedź.
Operatory bitowe w Javie tylko dla liczb całkowitych i długich?