类型转换指令

类型转换指令可以将两种不同的数值类型相互转换,这些转换操作一般用于实现用户代码中

的显示类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。

转换规则

Java虚拟机直接支持小范围类型向大范围类型的安全转换,即宽化类型转换(Widening Numeric Conversion

  • int类型到longfloat或者double类型
  • long类型到float或者double类型
  • float类型到double类型

窄化类型转换(Narrowing Numeric Conversion)必须显示使用转换指令来完成。

i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l、d2f
  1. 在将intlong类型窄化转换为整数类型T的时候,转换过程仅仅是简单丢弃除最低位N字节以外的内容。N是类型T的数据类型长度,这将可能导致转换结果与输入值有不同的正负号。
  1. Java虚拟机将一个浮点值窄化为整型的时候必须遵循一下的转换规则:

  2. 如果浮点值是NaN,那么转换结果就是intlong类型的0

  3. 如果浮点值不是无穷大的话,浮点值使用IEEE 754的向零舍入模式取整,获得整数值v

    如果v在目标类型Tintlong)的表示范围之内,那转换结果就是v,否则将根据v

    的符号,转换为T所能表示的最大或最小正数。

  1. doublefloat,如果转换结果的绝对值太小,无法用float表示,将返回float类型的正负零。

    如果转换结果的绝对值太大,无法用float表示,将返回float类型的正负无穷大。

代码验证

public static void main(String[] args) {

    // 窄化类型转换

    // long 2 int 符号错误,只是简单地去掉除最低位的16个字节以外的内容
    // 1 10000000 00000000 00000000 00000000
    long l = 6442450944L;
    int i = (int) l;
    System.out.println(i);

    // double 2 int,转换后超过范围,则用int/float的最大值/最小值表示
    double d = 999999999999999999999996999999999999D;
    i = (int) d;
    System.out.println(i);

    float f = (float) d;
    System.out.println(f);
}