#java #primitive
#java #примитив
Вопрос:
var foo = (short) 40 (byte) 10
Сколько байтов занимает foo?
Каков его тип?
Я ожидал бы, что результат сохраняется в кратком, но для экономии памяти проверяет ли JVM, поместится ли он в меньший примитив?
Если бы это было (short) 1 (byte) 1
, было бы это все равно коротким?
Комментарии:
1. 4. Результатом добавления short к байту является значение int, потому что операнды подвергаются двоичному числовому продвижению.
2. На самом деле это, вероятно, зависит от того, где
foo
определено: переменная класса? Локальная переменная? В любом случае, это почти навернякаint
.3. Это целое число. Когда вы добавляете меньшие целые типы, вы получаете int. Итак, 4 байта.
Ответ №1:
Эмпирическое правило: целочисленные арифметические операции выполняются как long
и приводят к long
, если любой из аргументов имеет значение long
, int
в противном случае.
Я также подозреваю, что JVM использует 4 байта даже для хранения переменных byte
and short
(и boolean
) — см. JVMS 2.6.1. Локальные переменные и таблицу 2.11.1-B.
Даже var test = (byte)1 (byte)1
приведет test
к int
.
Это не относится к var test = (byte)(1 1)