Conversión implícita de Java de int a byte

Estoy a punto de comenzar a trabajar en algo que requiere la lectura de bytes y la creación de cadenas. Los bytes que se leen representan cadenas UTF-16. Así que solo para probar las cosas, quería convertir una simple matriz de bytes en codificación UTF-16 a una cadena. Los primeros 2 bytes en la matriz deben representar la endianidad y, por lo tanto, deben ser 0xff 0xfe o 0xfe 0xff. Así que intenté crear mi matriz de bytes de la siguiente manera:

byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};

Pero obtuve un error porque 0xFF y 0xFE son demasiado grandes para encajar en un byte (porque los bytes están firmados en Java). Más precisamente, el error fue que el int no se pudo convertir en un byte. Sé que puedo convertir explícitamente de int a byte con un cast y lograr el resultado deseado, pero no es de eso de lo que trata mi pregunta.

Solo para probar algo, creé una cadena y llamé getBytes ("UTF-16") y luego imprimí cada uno de los bytes en la matriz. La salida fue un poco confusa porque los dos primeros bytes fueron 0xFFFFFFFE 0xFFFFFFFF, seguidos de 0x00 0x52 0x00 0x6F. (Obvisouly la endianness aquí es diferente de lo que intentaba crear arriba, pero eso no es importante).

Usando esta salida, decidí intentar crear mi matriz de bytes de la misma manera:

byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};

Y curiosamente, funcionó bien. Entonces, mi pregunta es: ¿por qué Java permite que un valor entero de 0xFFFFFF80 o mayor se convierta automáticamente en un byte sin una conversión explícita, pero cualquier cosa igual o mayor que 0x80 requiere una conversión explícita?

Respuestas a la pregunta(5)

Su respuesta a la pregunta