一 代码
public void testAddOperation() {
byte i = 15;
int j = 8;
int k = i + j;
}
二 编译并解析
使用 javap 命令反编译 class 文件: javap -v 类名.class
三 说明
byte、short、char、boolean 内部都是使用 int 型来进行保存的。
通过 bipush 对操作数 15 和 8进行入栈操作。
通过 iadd 方法进行相加操作,i 代表的就是 int,也就是 int 类型的加法操作。
四 图解
第1条指令:首先执行第一条语句,PC寄存器指向的是 0,也就是指令地址为 0,然后使用 bipush 让操作数15入栈。
bipush:当 int 取值 -128 ~ 127 时,JVM采用 bipush 指令将常量压入栈中。
第2条指令:执行完后,让 PC + 1,指向下一行代码,下一行代码就是将操作数栈的元素存储到局部变量表 1 的位置,我们可以看到局部变量表的已经增加了一个元素。
istore:将一个数值从操作数栈存储到局部变量表,该数值会从操作数栈弹出。
为什么局部变量表不是从 0 开始的呢?其实局部变量表也是从 0 开始的,但是因为 0 号位置存储的是 this 指针,这里就直接省略了,没有在图中画出。
第3条指令:PC+1,指向的是下一行。让操作数 8 也入栈。
第4条指令:PC+1,指向的是下一行。同时执行 store 操作,存入局部变量表中。
![image-20200706093751711](images/image-20200706093751711.png)
第5条指令:PC+1,指向的是下一行。从局部变量表中,将数据15加载到操作数栈中。
iload:将一个局部变量加载到操纵栈。
第6条指令:PC+1,指向的是下一行。从局部变量表中,将数据8加载到操作数栈中。
第7条指令:PC+1,指向的是下一行。将操作数栈中的两个元素执行相加操作,操作结果放入操作数栈。
iadd:将栈顶两 int 型数值相加并将结果压入栈顶。
第8条指令:PC+1,指向的是下一行。将操作数栈值存储到局部变量表3的位置。
第9条指令:PC+1,指向的是下一行。最后PC寄存器的位置指向10,也就是 return 方法,直接退出方法