类型转换指令
类型转换指令可以将两种不同的数值类型相互转换,这些转换操作一般用于实现用户代码中
的显示类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。
转换规则
Java
虚拟机直接支持小范围类型向大范围类型的安全转换,即宽化类型转换(Widening Numeric Conversion
)
int
类型到long
、float
或者double
类型long
类型到float
或者double
类型float
类型到double
类型
窄化类型转换(Narrowing Numeric Conversion
)必须显示使用转换指令来完成。
i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l、d2f
- 在将
int
或long
类型窄化转换为整数类型T
的时候,转换过程仅仅是简单丢弃除最低位N
字节以外的内容。N
是类型T
的数据类型长度,这将可能导致转换结果与输入值有不同的正负号。
Java虚拟机将一个浮点值窄化为整型的时候必须遵循一下的转换规则:
如果浮点值是
NaN
,那么转换结果就是int
或long
类型的0如果浮点值不是无穷大的话,浮点值使用
IEEE 754
的向零舍入模式取整,获得整数值v
。如果
v
在目标类型T
(int
或long
)的表示范围之内,那转换结果就是v
,否则将根据v
的符号,转换为
T
所能表示的最大或最小正数。
从
double
到float
,如果转换结果的绝对值太小,无法用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);
}