Ответ 1
Это объясняется в разделе 2.11.1 JVMS:
Обратите внимание, что большинство инструкций [...] не имеют форм для интегральных типов
byte
,char
иshort
. Ни у кого нет форм для типаboolean
. Компилятор кодирует нагрузки литеральных значений типовbyte
иshort
с помощью инструкций Java Virtual Machine, которые подписывают эти значения до значений типаint
во время компиляции или времени выполнения. [...] Таким образом, большинство операций над значениями фактических типовboolean
,byte
,char
иshort
корректно выполняются инструкциями, действующими на значения вычислительного типаint
.
Таким образом, это оправдано:
Учитывая размер байта одного байта Java Virtual Machine, типы кодирования в opcodes оказывают давление на дизайн его набора команд. Если каждая типизированная команда поддерживает все типы данных во время выполнения Java Virtual Machine, будет больше инструкций, чем может быть представлено в байте. Вместо этого набор команд виртуальной машины Java обеспечивает уменьшенный уровень поддержки типов для определенных операций. Другими словами, набор команд намеренно не ортогонален. Отдельные инструкции могут использоваться для преобразования между неподдерживаемыми и поддерживаемыми типами данных по мере необходимости.
Однако, хотя это относится к загрузке/хранению переменных стека, оно не применяется для загрузки/хранения в примитивных массивах; есть коды операций для всех примитивных типов.