在实际开发中,我们会经常遇到数据类型转换。数据类型转换,顾名思义就是将一个数据类型转换成另一个数据类型,这种转换方式可以分为两种,自动类型转换和强制类型转换。
自动类型转换
容量小的数据类型可以自动转换成容量大的数据类型,这里的容量指的是这个数据类型的取值范围。可以用下图表示除boolean之外七个基本数据类型的转换关系:
图中黑色箭头表示无数据丢失的自动类型转换,而红色箭头表示在转换时可能存在数据丢失。
byte、short、char在运算时也会转换成int,返回的结果也是int。我们也可以直接将整型常量直接赋值给byte、short、char等类型变量,而不需要进行强制类型转换,只要不超过其取值范围。
自动类型转换中很容易出现一个值溢出的问题,如下代码:
int money=100000000;
int years=20;
long total=money*years;
//返回的是负数,因为money和years都是int类型,相乘也为int,但其值超过了int的表数范围,所以溢出。
//错误修改*完已经溢出了
long total=(long)(money*years);
//正确修改
long total=(long)money*years;
//算一个人70年心跳多少次
long times=70*60*24*356*70;//溢出
//一般我们优先对第一个数进行类型转换(可能前面就已经溢出)
long times=70L*60*24*365*70;
可以很简单的看出,我们在处理值溢出的问题时,都是先进行类型转换再进行运算,避免在运算的时候先溢出,导致转换后的数据是错误的。
强制类型转换
强制类型转换时显示的转换一个数值的类型,强制转换的格式如下:
short s1 = 1;
int s2 = s1 + 2;//自动类型转换
short s3=(short) s2;//强制类型转换
但是在强制转换过程中有一个需要关注的问题,就是当一种类型强制转换成另一种类型而又超出目标类型的取值范围时,就会造成数据转换的损失,这以为着这个数据转换过程是毫无意义的。
表达式中类型提升问题
在混合多种数据类型的表达式中,类型会向容量大的值的数据类型提升。
int a = 5;
double b = a/2.0;
这是一个很简单的运算,但是在这个运算过程就能体现我们所说的类型提升问题。浮点数的默认类型是double,在a/2.0的运算过程中,a会由int自动转换成double类型,以便能与2.0进行同类型的运算。也就是说,在运算过程中,int类型提升为容量更大的double类型。