首页 > 代码库 > 《深入Java虚拟机学习笔记》- 第12章 整数运算
《深入Java虚拟机学习笔记》- 第12章 整数运算
Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算。当byte、short和char类型值参与算术运算时,首先会将它们转换为int类型。这些操作码都不会抛出异常,溢出在这里通常可以被忽略。
整数加法
操作码 | 操作数 | 说明 |
iadd | (无) | 从栈中弹出两个int类型数,相加,然后将所得int类型结果压回栈 |
ladd | (无) | 从栈中弹出两个long类型数,相加,然后将所得long类型结果压回栈 |
将一个常量与局部变量相加
操作码 | 操作数 | 说明 |
iinc | vindex,const | 把常量与一个位于vindex位置的int类型局部变量相加 |
wide | iinc,index,const | 把常量与一个位于vindex位置的int类型局部变量相加 |
iinc可以用来给局部变量赋值-128~127之间的值。这条操作码与用于控制循环执行的变量的加减相比,效率更高。加上wide可以用来把常量的范围增大到-32768~32767。
整数减法
操作码 | 操作数 | 说明 |
isub | (无) | 从栈中弹出两个int类型数,相减,然后将所得int类型结果压回栈 |
lsub | (无) | 从栈中弹出两个long类型数,相减,然后将所得long类型结果压回栈 |
从栈顶弹出两个数,顶端的充当减数,次顶端的充当被减数。
整数乘法
操作码 | 操作数 | 说明 |
imul | (无) | 从栈中弹出两个int类型数,相乘,然后将所得int类型结果压回栈 |
lmul | (无) | 从栈中弹出两个long类型数,相乘,然后将所得long类型结果压回栈 |
整数除法
操作码 | 操作数 | 说明 |
idiv | (无) | 从栈中弹出两个int类型数,相除,然后将所得int类型结果压回栈 |
ldiv | (无) | 从栈中弹出两个long类型数,相除,然后将所得long类型结果压回栈 |
从栈顶弹出两个数,次顶端的数除以顶端的数(首先被压入栈的数作为被除数或者分子,其次被压入的数作为除数或者分母)。如果整数被0除,会抛出ArithmeticException异常。
整数取余
操作码 | 操作数 | 说明 |
irem | (无) | 从栈中弹出两个int类型数,相减,然后将所得int类型余数压回栈 |
lrem | (无) | 从栈中弹出两个long类型数,相减,然后将所得long类型余数压回栈 |
如果整数被0除,会抛出ArithmeticException异常。
操作码 | 操作数 | 说明 |
ineg | (无) | 从栈中弹出两个int类型数,取反,然后将所得int类型结果压回栈 |
lneg | (无) | 从栈中弹出两个long类型数,取反,然后将所得long类型结果压回栈 |