2.2.5 数据类型转换

数据类型转换是将一种数据类型的值转换成另一种数据类型的值的操作。当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。数据类型转换方式有两种:自动类型转换与强制类型转换。

1.自动类型转换

将取值范围较小的类型的数值赋给取值范围较大的类型的变量时,Java会自动将取值范围较小的数值转换为取值范围较大的类型,这称为自动类型转换。自动类型转换按数据类型取值范围从小到大的顺序转换,不同类型数据间的优先关系为:byte → short → int → long → float →double。

另外,char型可以自动转换为int型。

【示例】自动类型转换,代码如下。


double num1=100;                 //将整型值100赋给double型变量num1 
System.out.println(num1);      //将输出100.0,而不是100

控制台输出100.0,而不是原始值100,证明发生了数据类型转换。这里整型值100赋给double型变量num1,虽然类型不一致,但由于值100作为int型,其取值范围比赋值目标变量的double型的取值范围要小;因此按照上述顺序,它可以自动转换为double型,再赋给double型变量num1。同样,已赋过值的取值范围较小的类型的变量赋给取值范围较大的变量时,会发生自动类型转换。代码如下。


int num1=100; 
double num2=num1;   //int型变量赋给double型变量时,发生自动类型转换 
System.out.println(num2);

其他自动类型转换示例程序,代码如下。


public static void main(String[]args) { 
      //自动类型转换 
      byte b=100; 
      short s=b;//byte-->short 
      System.out.println("byte-->short:"+s); 
      int i=s;  //short-->int 
      System.out.println("short-->int:"+i);       
      char c='a'; 
      i=c; 
      System.out.println("char-->int:"+i);             
      long l=i; //int--->long 
      System.out.println("int--->long:"+l);             
      float f=l; //long-->float 
      System.out.println("long-->float:"+f); 
      double d=f; //float-->double 
      System.out.println("float-->double:"+d); 
}

运行结果:


byte-->short:100 
short-->int:100 
char-->int:97 
int--->long:97 
long-->float:97.0 
float-->double:97.0

2.强制类型转换

强制类型转换是将取值范围较大的类型的数值转换成取值范围较小的类型的数值。强制类型转换的前提是数据类型要兼容,并且源类型的取值范围大于目标类型。强制类型转换可能会损失精度。强制类型转换的语法:


(目标类型) 源类型;

源类型:取值范围要比目标类型大,可以是值或变量。

【示例】强制类型转换,代码如下。


int num=(int)2.2; 
System.out.println(num);

输出结果为2,将double型转换成为int型,小数部分的0.2被截去,所以说强制类型转换可能会损失精度。

int型强制转换为byte型也会有精度损失。

【示例】强制类型转换造成精度损失,代码如下。


byte b; 
int i=264; 
b=(byte)i; 
System.out.println("i="+i); 
System.out.println("b="+b);

运行结果:


i=264 
b=8

int型值264强制转换为byte型后变成了8,明显发生了精度损失,这是为何呢?因为int型值是32位的,即4字节,整数264存储在计算机中的二进制形式如下所示:

00000000 00000000 00000001 00001000

当强制转换为byte型时,由于byte型只有8位(1字节),这样264的高位的3字节全部丢弃,只剩下最低位的1字节,此时二进制形式如下:

00001000

这样,它的值就变成8了。

int型也可强制转换为char型,如System.out.println((char)98);将输出b,转换依据是ASCII编码表。