深入虚拟机笔记之整数运算

第12章 整数运算

    二进制补码运算:java虚拟机支持的所有整数类型:byte、short、int、long,它们都是带符号的二进制补码数。在一个二进制补码数中,最重要的位是它的符号位(最高位),0表示正整数和0,1表示负整数。

    能够被二进制补码表示的数值范围为:2的总位数的次幂。其中一半是0和正整数,一半是负整数。

    在带符号二进制补码数上进行的加法运算与在无符号二进制数上进行的加法运算一样。两个数相加(忽略最高位的溢出),结果被解释为一个带符号的二进制补码数。java虚拟机中出现的整数运算的溢出并不会导致抛出异常,其结果只被简单地截短以符合数据类型(int类型或者long类型)。在java编程中,必须随时注意可能发生的溢出,确认所选择的数据类型是否正确。整数被0除时会抛出一个ArithmeticException异常。

    如果long类型的长度仍然不能满足需要,可以使用java.math包中的BigInteger类,这个类的实例可以描述任意长度的整数。BigInteger类支持在任意长度整数上进行的所有数学运算,前提是这些运算是基于java虚拟机和java.lang.Math包所支持的基本类型的。

    运算操作码:java虚拟机提供几种进行整数算术运算的操作码,它们执行基于int和long类型的运算。

    整数加法:整数加法可以在int和long类型上进行,弹出栈顶部的两个值,相加,把结果压入栈。必须有指令先把两个相加的整数压入栈中,值的类型由操作码自己决定,最后得到的结果总是与相加的成员具有同样的类型。加法操作码不会导致任何异常抛出,溢出在这里通常被忽略。

   iinc操作码对int类型局部变量执行加法操作,操作码之后的第2个字节被解释为一个8位的二进制补码数。局部变量和8位带符号值相加,结果被写回局部变量。

扫描二维码关注公众号,回复: 651787 查看本文章

 
    整数减法:执行int和long类型的减法运算,从栈顶弹出两个相同类型的值,顶端的值充当减数,底端的值充当被减数(底端的值 - 顶端的值),进行减法运算,结果被压入栈。此类操作不会导致抛出异常。

    整数乘法:执行int和long类型的乘法运算,从栈顶弹出两个相同类型的值并相乘,结果被压入栈。此类操作不会导致异常抛出。 

    整数除法:执行int和long类型的除法运算,从栈顶弹出两个相同类型的值,底端的数除以顶端的数(栈顶部的数作为除数或者分母,底端的值 / 顶端的值),结果被压入栈。对于整数除法所产生的结果将今夕取整操作;如果整数被0除(栈顶的值为0),则抛出ArithmeticException异常。

    整数取余:执行int和long类型的取余运算,从栈顶弹出两个相同类型的值,底端的数除以顶端的数(栈顶部的数作为除数或者分母,底端的值 % 顶端的值),除法的余数被压入栈。如果整数被0除(栈顶的值为0),则抛出ArithmeticException异常。

    整数取反:执行int和long类型的取反运算,弹出栈顶部的值,取反,结果被压入栈。此类操作不会导致异常抛出。 

 

猜你喜欢

转载自jaesonchen.iteye.com/blog/2289603