1.4.4 数值的类型转换
当运算符的操作数是不同的数值类型时,在运算之前,这些数值会自动转换为一个通用的类型。转换是按照以下顺序进行的。
● 如果两个操作数中有一个为double类型,则另一个将转换为double类型。
● 如果其中一个操作数是float类型,则另一个将转换为float类型。
● 如果其中一个操作数是long类型,则另一个将转换为long类型。
● 否则,两个操作数都转换为int类型。
例如,如果计算3.14 + 42,那么第二个操作数将会从int类型转换为double类型的值42.0,然后进行加法计算,得到double类型的值45.14。
如果计算 'J' + 1,则char类型的值'J'将被转换成为int类型的值74,最后结果为int类型的值75。至于如何将该值转换回char类型,还需要继续阅读后面的内容。
当你将数值类型的值赋值给一个变量,或将其作为参数传递给一个方法时,如果类型不匹配,则必须转换该值的类型。例如,在以下赋值中,值42会自动从int类型转换为double类型。
double x = 42;
在Java中,如果没有精度损失,那么将发生以下形式的转换:
● 从byte类型到short类型、int类型、long类型,或者double类型;
● 从short类型和char类型到int类型、long类型,或者double类型;
● 从int类型到long类型或者double类型。
所有的整数类型都会被转换成为浮点类型。
警告:以下转换可能会丢失精度信息。
● 从int类型到float类型。
● 从long类型到float类型或double类型。
例如,考虑以下赋值:
float f = 123456789;
因为float类型只有7位有效数字,所以f实际上是1.23456792E8。
为了实现这些自动转换之外的类型转换,需要使用强制类型转换运算符,强制类型转换的语法格式是在圆括号中指定目标类型的名称。例如:
double x = 3.75; int n = (int) x;
在这种情况下,小数部分将会被舍弃,n会被设置为3。
如果想四舍五入到最接近的整数,可以使用Math.round方法,该方法返回一个long类型的值。如果明确知道结果更加适合int类型,可以调用:
int n = (int) Math.round(x);
在这个示例中,x为3.75,n被设置为4。
如果需要将整数类型转换为另一个字节更少的类型,也需要使用强制转换:
int n = 1; char next = (char)('J' + n); // Converts 75 to 'K'
在这种强制转换中,只保留最后的字节,例如:
int n = (int) 3000000000L; // Sets n to -1294967296
注意:如果担心强制类型转换会无警告地丢弃数值的重要部分,那么可以使用Math.toIntExact方法。当该方法无法将long类型转换为int类型时,就会产生异常。