((short)2)
Да, это не совсем короткий литерал, скорее каст-инт, но поведение то же самое, и я думаю, что нет прямого способа сделать это.
Я так и делал, потому что ничего не мог найти по этому поводу. Я бы предположил, что компилятор будет достаточно умен, чтобы скомпилировать его, как если бы он был коротким литералом (то есть он фактически не выделил бы int, а затем приводил бы его каждый раз).
Следующее иллюстрирует, насколько вам следует беспокоиться об этом:
a = 2L;
b = 2.0;
c = (short)2;
d = '\2';
Компилировать -> дизассемблировать ->
movl $2, _a
movl $2, _b
movl $2, _c
movl $2, _d