您的位置:首页 > 其它

(二十一)类型转换指令

2018-05-21 17:05 162 查看

一、概念

  • 类型转换指令可以将两种 Java 虚拟机数值类型进行相互转换,这些转换操作一般用于实现用户代码的显式类型转换操作,或者用来处理 Java 虚拟机字节码指令集中指令非完全独立独立的问题。
  • Java 虚拟机直接支持(译者注:“直接支持”意味着转换时无需显式的转换指令)以下数值的宽化类型转换(Widening Numeric Conversions,小范围类型向大范围类型的安全转换):
  1. int 类型到 long、float 或者 double 类型
  2.  long 类型到 float、double 类型
  3.  float 类型到 double 类型
  • 窄化类型转换(Narrowing Numeric Conversions)指令包括有:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l 和 d2f。窄化类型转换可能会导致转换结果产生不同的正负号、不同的数量级,转换过程很可能会导致数值丢失精度。 
  • 在将 int 或 long 类型窄化转换为整数类型 T 的时候,转换过程仅仅是简单的丢弃除最低位N 个字节以外的内容,N 是类型 T 的数据类型长度,这将可能导致转换结果与输入值有不同的正负号(译者注:在高位字节符号位被丢弃了)。 
  • 在将一个浮点值转窄化转换为整数类型 T(T 限于 int 或 long 类型之一)的时候,将遵循以下转换规则:
     如果浮点值是 NaN,那转换结果就是 int 或 long 类型的 0
     否则,如果浮点值不是无穷大的话,浮点值使用 IEEE 754 的向零舍入模式(§2.8.1)
    取整,获得整数值 v,这时候可能有两种情况:
             如果 T 是 long 类型,并且转换结果在 long 类型的表示范围之内,那就转换为 long
              类型数值 v
        如果 T 是 int 类型,并且转换结果在 int 类型的表示范围之内,那就转换为 int
             类型数值 v
     否则:
              如果转换结果 v 的值太小(包括足够小的负数以及负无穷大的情况),无法使用 T 类
                 型表示的话,那转换结果取 int 或 long 类型所能表示的最小数字。
             如果转换结果 v 的值太大(包括足够大的正数以及正无穷大的情况),无法使用 T 类
                型表示的话,那转换结果取 int 或 long 类型所能表示的最大数字。
    从 double 类型到 float 类型做窄化转换的过程与 IEEE 754 中定义的一致,通过 IEEE 754
    向最接近数舍入模式(§2.8.1)舍入得到一个可以使用 float 类型表示的数字。如果转换结果
    的绝对值太小无法使用 float 来表示的话,将返回 float 类型的正负零。如果转换结果的绝对值
    太大无法使用 float 来表示的话,将返回 float 类型的正负无穷大,对于 double 类型的 NaN
    值将就规定转换为 float 类型的 NaN 值。
    尽管可能发生上限溢出、下限溢出和精度丢失等情况,但是 Java 虚拟机中数值类型的窄化转
    换永远不可能导致虚拟机抛出运行时异常(此处的异常是指《Java 虚拟机规范》中定义的异常,
    请读者不要与 IEEE 754 中定义的浮点异常信号产生混淆)

 

二、案例

  • 源码如下:
package jvm;

public class TypeTranster {

public static void add() {

int hour = 24;

long mi = hour * 60 * 60 * 1000;
long mic =(long)hour * 60 * 60 * 1000 * 1000;
System.out.println(mic/mi);
}

public static void main(String[] args) {
add();
}

}
  • 字节码操作指令分析如下:

下图中的args_size=0,上文说的每个方法都会自动加个this,但是这是方法是static方法,所有没有this,所以args_size=0

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: