学习了前面的数据类型后,大家会思考一个问题,数据类型之间是否可以转换呢?数据类型的转换情况比较复杂。基本数据类型中数值类型之间可以互相转换,布尔类型不能与它们之间进行转换。但有些不兼容类型之间,如String(字符串)转换为int整数等,可以借助于一些类的方法实现。本节只讨论数值类型的互相转换。
从图5-1中可见,数值类型包括byte、short、char、int、long、float和double,这些数值类型之间的转换有两个方向:自动类型转换和强制类型转换。
自动类型转换就是需要类型之间转换是自动的,不需要采取其他手段,总的原则是小范围数据类型可以自动转换为大范围数据类型。类型转换顺序如图5-2所示,从左到右是自动的。
图5-2 数据类型转换顺序
注意
如图5-2所示,char类型比较特殊,char自动转换为int、long、float和double,但byte和short不能自动转换为char,而且char也不能自动转换为byte或short。
自动类型转换不仅发生在赋值过程中,在进行数学计算时也会发生自动类型转换,在运算中往往是先将数据类型转换为同一类型,然后再进行计算。转换规则如表5-4所示。
表5-4 计算过程中自动类型的转换规则
示例如下:
上述代码第①行中表达式floatNum∗intNum+doubleNum/shortNum进行数学计算,该表达式是由4个完全不同的数据类型组成,范围最大的是double,在计算过程中它们先转换成double,最后的结果类型是double。
在数值类型转换过程中,除了需要自动类型转换外,有时还需要强制类型转换,强制类型转换是在变量或常量之前加上“(目标类型)”实现。示例代码如下:
上述代码(byte)i表达式实现强制类型转换。强制类型转换主要用于大宽度类型转换为小宽度类型情况,如把int转换为byte。示例代码如下:
上述代码第①行是将int类型的i变量强制转换为int类型,这显然没有必要,但是语法也是允许的。代码第②行是将byte类型的b变量强制转换为int类型,从图5-2中可见这个转换是自动的,不需要强制转换。本例中这个转换没有实际意义,但有时为了提高精度需要这种转换。示例代码如下。
输出结果为:
比较上述代码输出结果发现,c1和c2变量小数部分差别是比较大的,这种差别在一些金融系统中是不允许的。在代码第①行i除以3中结果是小数,但由于两个操作数都是整数int类型,小数部分被截掉了,结果是3,然后再赋值给float类型的c1变量,最后c1保存的是3.0。为了防止两个整数进行除法等运算导致小数位被截掉问题,可以将其中一个操作数强制类型转换为float,见代码第③行,这样计算过程中操作数是float类型,结果是float不会截掉小数部分。
再看一个强制类型转换与精度丢失的示例:
输出结果为:
从上述代码输出结果可见,经过强制类型转换后,原本的6666666666L变成了负数。当大宽度数值转换为小宽度数值时,大宽度数值的高位被截掉,这样就会导致数据精度丢失。除非大宽度数值的高位没有数据,就是这个数比较小的情况,例如将6666666666L换为6L就不会丢失精度。