Если short
автоматически повышается до int
арифметических операций, то почему:
short thirty = 10 * 3;
Законное присвоение short
переменной thirty
?
В свою очередь, это:
short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
а также это:
int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
не компилируется, потому что присвоение int
значения a short
не допускается без ожидаемого приведения.
Что-то особенное происходит с числовыми литералами?
java
short
type-promotion
Потолок Геккон
источник
источник
short thirty = 10 * 3;
скорее всего заменяетсяshort thirty = 30;
компилятором, который тогда является допустимым оператором. (Хотя мне придется поискать соответствующий раздел JLS).10 * 3
и инициализирует переменную с результатом. В вашем нерабочем примере вычисление происходит во время выполнения, когда JVM выполняет короткий.final int ten = 10; final int three = 3; short thirty = ten * three;
компилируется нормально.If short is automatically promoted to int in arithmetic operations
- это не актуально. Ни ,10
ни3
не являются шорты и они не способствовали, они литералы.10
и3
оцениваютсяint
компилятором как s?Ответы:
Потому что компилятор заменяет
10*3
30 во время самой компиляции . Итак, эффективно:short thirty = 10 * 3
вычисляется во время компиляции.Попробуйте изменить
ten
иthree
наfinal short
(заставить их компилировать константы времени) и посмотрите, что произойдет: PИзучите использование байт-кода
javap -v
для обеих версий (10*3
иfinal short
). Вы увидите, что разница небольшая.Итак, вот разница в байтовом коде для разных случаев.
Случай 1 :
Байт-код:
Случай -2:
Байт-код:
Случай -3:
Байт-код:
В приведенном выше случае
10
и3
берутся из локальных переменныхs1
иs2
источник
Try changing ten and three to final short
упражнение :)you will see that there's no difference (between those two lines in the decompiled code)
потому что разве это не ваша точка зрения?case 10*3:
и подобное разрешено в конструкции переключателя.Да, с буквальным регистром происходит что-то особенное:
10 * 3
будет оцениваться во время компиляции . Таким образом, вам не нужно явное(short)
преобразование для умноженных литералов.ten * three
не оценивается во время компиляции, поэтому требует явного преобразования.Другое дело, если бы
ten
иthree
были отмеченыfinal
.источник
В следующем ответе добавлен раздел JLS и некоторые подробности об этом поведении.
Согласно JLS §15.2 - Формы выражений
источник