整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算,或者当一种数据类型变量的值赋给另外一种数据类型的变量时,也会涉及数据类型的转换。数据类型的转换有两种方式:隐式类型转换(自动转换)和显式类型转换(强制转换)。
从低级类型向高级类型的转换,系统自动执行,程序员无须进行任何操作。这种类型的转换称为隐式转换。除了布尔型不参与转换外,其他数据类型转换的顺序如下。
byte ,short,char -->int -->long -->float -->double
当进行赋值运算时,目标类型大于源类型,会自动进行类型转换。例如,在计算表达式的值时,参与运算的数据只要有一个是double型,则其他数据都会自动转换为double,然后再进行运算,最后表达式的结果也是double型。
【例2-14】自动类型转换。实例代码如下。
public class AutoConvert {
public static void main(String[] args) {
char c1='a';//定义一个char类型
int i1 = c1;// char自动类型转换为int
System.out.println("char自动类型转换为int后的值等于"+i1);
char c2 = 'A';//定义一个char类型
int i2 = c2+1;// char 类型和 int 类型计算
System.out.println("char类型和int计算后的值等于"+i2);
}
}
程序运行结果如图2-7所示。
图2-7 例2-14的运行结果
c1的值为字符a,查ASCII码表可知对应int类型值为97,A对应值为65,所以i2=65+1=66。
当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换运算,又称强制类型转换。
强制类型转换的语法规则如下。
(type)variableName;
其中,type为variableName要转换的数据类型,而variableName是要进行类型转换的变量名称,示例如下。
int a = 3;
double b = 5.0;
a = (int)b; //将double类型的变量b的值转换为int类型,然后赋值给变量a
如果此时输出a的值,结果是5。
需要注意的是,强制类型转换可能会导致数据精度的损失。例如如下代码。
int i =128;
byte b = (byte)i;
因为byte类型是8位,最大值为127,所以当int强制转换为byte类型时,值达到128时候就会导致溢出。
另外,浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如如下代码。
(int)23.7 == 23;
(int)-45.89f == -45