Aunque es demasiado tarde, me gustaría dar mi opinión sobre esto, ya que podría aclarar por qué funciona la solución proporcionada por JB Nizet. Me encontré con este pequeño problema trabajando en un analizador de bytes y en la conversión de cadenas yo mismo. Cuando copia de un tipo integral de mayor tamaño a un tipo integral de menor tamaño, ya que este documento de Java dice que esto sucede:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
Una conversión de restricción de un entero con signo a un tipo integral T simplemente descarta todo menos el n más bajo bits de orden, donde n es el número de bits utilizados para representar el tipo T.Además de una posible pérdida de información sobre la magnitud del valor numérico, esto puede provocar que el signo del valor resultante difiera del signo del valor de entrada .
Puede estar seguro de que un byte es un tipo integral, ya que este documento de Java dice
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
byte: el tipo de datos de byte es un dos de 8 bits firmado complemento entero.
Entonces, en el caso de convertir un número entero (32 bits) en un byte (8 bits), simplemente copie los últimos (8 bits menos significativos) de ese número entero en la variable de byte dada.
int a = 128;
byte b = (byte)a; // Last 8 bits gets copied
System.out.println(b); // -128
La segunda parte de la historia involucra cómo los operadores unarios y binarios de Java promueven los operandos.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2 La
conversión primitiva de ampliación (§5.1.2) se aplica para convertir uno o ambos operandos como se especifica por las siguientes reglas:
Si alguno de los operandos es de tipo double, el otro se convierte en double.
De lo contrario, si alguno de los operandos es de tipo flotante, el otro se convierte en flotante.
De lo contrario, si alguno de los operandos es de tipo long, el otro se convierte en long.
De lo contrario, ambos operandos se convierten al tipo int.
Tenga la seguridad de que si está trabajando con el tipo integral int y / o inferior, se promoverá a un 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
También me rasqué la cabeza con esto :). Hay una buena respuesta para esto aquí por rgettman.
¿Operadores bit a bit en java solo para enteros y largos?