Même s'il est trop tard, j'aimerais donner mon avis à ce sujet car cela pourrait clarifier pourquoi la solution proposée par JB Nizet fonctionne. Je suis tombé sur ce petit problème en travaillant sur un analyseur d'octets et à la conversion de chaînes moi-même. Lorsque vous copiez d'un type intégral de taille plus grande vers un type intégral de taille plus petite, comme ce document java dit que cela se produit:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
Une conversion restrictive d'un entier signé en un type intégral T rejette simplement tout sauf le n le plus bas bits d'ordre, où n est le nombre de bits utilisés pour représenter le type T.En plus d'une éventuelle perte d'informations sur l'amplitude de la valeur numérique, cela peut faire en sorte que le signe de la valeur résultante diffère du signe de la valeur d'entrée .
Vous pouvez être sûr qu'un octet est un type intégral comme ce document java dit
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
octet: Le type de données octet est un deux signés 8 bits complément entier.
Donc, dans le cas de la conversion d'un entier (32 bits) en un octet (8 bits), vous copiez simplement le dernier (8 bits les moins significatifs) de cet entier dans la variable d'octet donnée.
int a = 128;
byte b = (byte)a; // Last 8 bits gets copied
System.out.println(b); // -128
La deuxième partie de l'histoire concerne la manière dont les opérateurs unaires et binaires Java promeuvent les opérandes.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2 L'
élargissement de la conversion primitive (§5.1.2) est appliqué pour convertir l'un ou les deux opérandes comme spécifié par les règles suivantes:
Si l'un des opérandes est de type double, l'autre est converti en double.
Sinon, si l'un des opérandes est de type float, l'autre est converti en float.
Sinon, si l'un des opérandes est de type long, l'autre est converti en long.
Sinon, les deux opérandes sont convertis en type int.
Rassurez-vous, si vous travaillez avec le type intégral int et / ou inférieur, il sera promu en int.
// byte b(0x80) gets promoted to int (0xFF80) by the & operator and then
// 0xFF80 & 0xFF (0xFF translates to 0x00FF) bitwise operation yields
// 0x0080
a = b & 0xFF;
System.out.println(a); // 128
Je me suis aussi gratté la tête :). Il y a une bonne réponse ici par rgettman.
Opérateurs binaires en java uniquement pour les entiers et les longs?