JVM中 int 类型数值,根据 取值范围将 入栈的 字节码指令 就分为4类:
取值 -1~5 采用 iconst 指令;
取值 -128~127 采用 bipush 指令;
取值 -32768~32767 采用 sipush指令;
取值 -2147483648~2147483647 采用 ldc 指令。
不同范围,不同字节数的,整型数据采用不同的加载指令;看上去是为了性能;
一个示例;
public class loaddemo
{
public static void main(String args[]) {
int myi = 5;
int myj = -1;
int mybb = 127;
int myds = 32767;
int myzds = Integer.MAX_VALUE;
}
}
编译并反编译后如下;
从 Constant pool(冒号) 到大括号开始,是常量池;
看一下对应的指令分别是,
iconst_5
iconst_m1
bipush 127
sipush 32767
ldc #3 // int 2147483647