Я собираюсь начать работать над чем-то, что требует чтения байтов и создания строк. Читаемые байты представляют строки UTF-16. Так что просто для проверки я хотел преобразовать простой байтовый массив в кодировке UTF-16 в строку. Первые 2 байта в массиве должны представлять порядковый номер и должны быть 0xff 0xfe или 0xfe 0xff. Поэтому я попытался создать свой байтовый массив следующим образом:
byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};
Но я получил ошибку, потому что 0xFF и 0xFE слишком велики, чтобы вписаться в байт (потому что байты подписаны в Java). Точнее, ошибка заключалась в том, что int нельзя преобразовать в байт. Я знаю, что мог бы просто явно преобразовать int в байт с помощью приведения и достичь желаемого результата, но это не то, о чем мой вопрос.
Просто чтобы попробовать что-то, я создал String и вызвал getBytes ("UTF-16"), а затем напечатал каждый из байтов в массиве. Вывод был немного запутанным, потому что первые два байта были 0xFFFFFFFE 0xFFFFFFFF, а затем 0x00 0x52 0x00 0x6F. (Obvisouly здесь порядок байтов отличается от того, что я пытался создать выше, но это не важно).
Используя этот вывод, я решил попытаться создать свой байтовый массив так же:
byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};
И как ни странно, все работало нормально. Поэтому у меня вопрос: почему Java допускает автоматическое преобразование целого значения 0xFFFFFF80 в байт без явного преобразования, но для любого значения, равного или превышающего 0x80, требуется явное приведение?