1. 数值类型之间的转换
图中的 6 个实线箭头,表示无信息丢失的转换。3 个虚线箭头表示可能有精度损失的转换。
- byte --> short, 无信息丢失的转换
- short --> int, 无信息丢失的转换
- char --> int, 无信息丢失的转换
- int --> long, 无信息丢失的转换
- int --> double, 无信息丢失的转换
- float --> double, 无信息丢失的转换
- int --> float, 可能有精度丢失
- long --> float, 可能有精度丢失
- long --> double, 可能有精度丢失
例如,123 456 789 是一个大整数,它所包含的位数比 float 类型所能够表示的位数多。当这个整数转换为 float 类型时,将会得到正确的大小,但会损失一些精度。
int n = 123456789;
float f = n;
System.out.println(f); // 打印 1.23456792E8
两个数值进行二元操作时,先要将两个操作数转换为同一个类型,然后再进行计算。
- 如果两个操作数中有一个是 double 类型,另一个操作数就会转换为 double 类型。
- 否则,如果其中一个操作数是 float 类型,另一个操作数转换为 float 类型。
- 否则,如果其中一个操作数是 long 类型,另一个操作数将会转换为 long 类型。
- 否则,两个操作数转换为 int 类型。
2. 强制类型转换
在必要的时候,int 类型的值将会自动地转换为 double 类型。另一方面,有时也需要将 double 转换为 int。在 Java 中,允许进行这种数值之间的转换,当然,有可能会丢失一些信息。这种有可能损失信息的转换要通过强制类型转换(cast) 来完成。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。例如:
double x = 9.97;
int nx = (int) x; // nx 的值为 9
变量 nx 的值为 9,因为强制类型转换通过截断小数部分将浮点值转换为整形。
如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte) 300 的实际值为 44。