Java | 类型转换
类型转换
自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为空量大的数据类型。(容量大小不是看字节数来定的,是按照类型可以容纳多的数来定的,所以long,可以自动转为float)
//特例:
byte a = 123; //常量是为int,但是这里没有报错,就是因为自动转换
//byte b = 1234; //报错,是因为1234这个常量的值超过byte类型的最大值了
强制类型转换
强制类型转换,是用于显式的转换一个数值的类型,在有可能丢失信息的情况下进行的转换是可能造成精度的溢出或降低的。
例:
double a = 1.2222;
int b = (int) a;
System.out.println("b=" + b);
//结果为:b=1
//精度变低了,并且没有小数部分了
基本数据转换的一个经典错误
操作较大的数的时候,有时会在不经意间溢出,尤其是操作整数的时候。
int a = 1000000000; //10亿
int b = 20;
int num = a * b;
System.out.println("num=" + num);
//输出的结果:num=-1474836480
//输出的结果是一个负数,是因为a和b的乘积已经超过了int的最大值了
//发生了内存溢出问题,所以就变成一个负数了。但是如果是下面这样呢:
long num2 = a * b;
System.out.println("num2=" + num2);
//输出的结果还是:num2=-1474836480
//输出的结果还是一个负数,是因为 = 符号从右往左运算的,先计算左边的值
//再赋值给右边,当右边计算完成时,还是一个int类型,
//但是已经溢出了,再转为long类型也没有用了
//下面的是正确的:
long num3 = a * (long)b;
System.out.println("num3=" + num3);
//结果为:num3=20000000000
//为什么可以成功呢?
//因为在等号右边进行计算前,b已经转为long类型了,
//所以当一个表达式中有一个long类型的时候,这个表达式的值为long的。
关注公众号,随时获取最新资讯
细节决定成败!
个人愚见,如有不对,恳请斧正!