Conversão implícita de Java de int para byte

Estou prestes a começar a trabalhar em algo que requer leitura de bytes e criação de strings. Os bytes sendo lidos representam strings UTF-16. Então, apenas para testar as coisas, eu queria converter uma matriz de bytes simples na codificação UTF-16 para uma string. Os primeiros 2 bytes da matriz devem representar o endianness e, portanto, devem ser 0xff 0xfe ou 0xfe 0xff. Então, tentei criar minha matriz de bytes da seguinte maneira:

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

Mas recebi um erro porque 0xFF e 0xFE são muito grandes para caber em um byte (porque os bytes são assinados em Java). Mais precisamente, o erro foi que o int não pôde ser convertido em um byte. Eu sei que eu poderia apenas converter explicitamente de int para byte com um elenco e alcançar o resultado desejado, mas não é isso que a minha pergunta é sobre.

Apenas para testar algo, criei uma String e chamei getBytes ("UTF-16") e imprimi cada um dos bytes na matriz. A saída foi um pouco confusa porque os dois primeiros bytes foram 0xFFFFFFFF 0xFFFFFFFF, seguido por 0x00 0x52 0x00 0x6F. (Obviamente, o endianness aqui é diferente do que eu estava tentando criar acima, mas isso não é importante).

Usando essa saída, decidi tentar criar minha matriz de bytes da mesma maneira:

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

E, estranhamente, funcionou bem. Então, minha pergunta é: por que o Java permite que um valor inteiro de 0xFFFFFF80 ou maior seja automaticamente convertido em um byte sem uma conversão explícita, mas qualquer coisa igual ou maior que 0x80 requer uma conversão explícita?

questionAnswers(5)

yourAnswerToTheQuestion