Существует несколько различных инструкций, которые можно использовать для вставки целочисленной константы.
Наименьшее - это инструкция iconst_ *. Это только один байт, потому что значение закодировано в самом коде операции. iconst_1, iconst_2 и т. д. - это разные коды операций. Например, iconst_5
будет закодировано как байт 08
.
Примечание: iload
- это совершенно не связанная инструкция, используемая для загрузки значения локальной переменной. Вы, должно быть, думали о iconst _ *.
Далее следует bipush
, который может выдавать константу в диапазоне от -128 до 127. Эта инструкция имеет длину два байта - первый байт является кодом операции, а второй байт представляет собой 8-разрядное целое число со знаком. Вы даже можете использовать его для вывода констант в диапазоне от -1 до 5, хотя это займет больше места в файле классов, чем необходимо. Например, bipush 5
будет закодировано как 10 05
. (0x10 - это код операции для bipush)
Далее следует sipush
, то есть то же самое, за исключением того, что оно хранит 16-битную константу вместо 8-битной константы, и, следовательно, длина инструкции составляет три байта. Код операции для sipush - 0x11, поэтому sipush 5
будет закодирован как трехбайтовая последовательность 11 00 05
.
Вы можете задаться вопросом, как хранятся целочисленные константы, которые не помещаются в 16 битах. В этом случае компилятор создает записи в отдельном разделе файла классов, называемом пулом констант, и затем использует инструкцию ldc
или ldc_w
для ссылки на запись константы.