上一节讲述了加载和存储指令,但是如果只知道存取,JVM便没有了灵魂。计算机,计算两个字才是关键,那么作为JVM也需要去进行计算,最简单的计算莫过于加减乘除,下面看一下加减乘除的具体指令有哪些,文章的结尾我们也会给出1+1=2的运算过程。
运算指令
当进行除法和求余计算时,如果除数为0,那么则会抛出java.lang.ArithmeticException异常,其余任何场景都不应该抛出运行时异常。
JVM在实现运算指令处理的时候必须遵循IEEE 754规范。
类型转换指令
类型转换指令可以将两种不同的数值类型进行转换,JVM直接支持以下类型的宽化类型转化:
但是窄化类型转换则需要类型转换指令的支持,类型转换指令主要有以下几种:
int或者long类型的窄化只需要将最高的几位丢弃,保留最低的N位(N为转换后的数据类型长度)即可,因此在窄化后会出现正负号的差异。
float和double窄化成整数类型,需要采取向零舍入(结果朝0的方向进行舍入)的规则,如果是10.9,转换成int以后就是10,如果浮点数转换后超过了int或者long的范围,那么会根据向零舍入后的数据的符号返回其最大或最小的正数,这里特别强调是正数。
1+1=2
public class ClassTest {
public int add(int a, int b) {
return a + b;
}
}
我们看一反编译后的Class文件,如下图:
着重看红框中的部分,红框中的含义就是将局部变量表中的第二个(a)和第三个元素(b)依次压入操作数栈,然后使用iadd弹出操作数栈顶两个元素进行加法运算,将结果再压入操作数栈顶,最后一个ireturn实际是将栈顶的元素进行返回(也就是a+b的结果)。
本期的运算和类型转换指令就介绍到这,我们下期再见!!!