数据类型转换规则
八种数据类型当中,除布尔类型之外剩下的七种数据类型可以互相转换。
小容量向大容量转换,称之为自动类型转换。容量从小到大排序:
byte < short < int < long < float < double < char
大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符👉(int)👈,程序才能编译通过,但是有可能会损失精度。
当整数字面值没有超出byte short char的取值范围,可以直接赋值给byte short char类型的变量。
byte short char混合运算时,各自先转成int类型再做运算。
多种数据类型混合运算时,先转换成容量最大的类型再做运算。
关于Java编译问题
注意: 可以编译通过, 3 没有超出byte类型取值范围
byte b = 3;
编译错误,因为编译器只检查语法,不会"运算" i / 3,只有涉及到JVM才会运算,编译期不执行
int i= 10;
byte b = i / 3;
注意: 任何浮点类型不管占用多少字节,都比整数型容量大。char和short可表示种类数量相同, 但是char可以取更大的正整数。
javac检查语法与编译,并不会执行代码,只有经过JVM才可能执行
float转short损失精度
当float转为short时,编译成功但损失精度,最终结果为20
public static void main(String[] args){
float a = 20.12f;
short s = (short)a;
out.println(s);
}
类型转换
在Java中从左到右先算小括号,以下代码编译报错是因为第五条规则byte short char混合运算时,各自先转成int类型再做运算,而下面先给s转为byte,但是运算时依然会将s转回int,所以语法错误
short s = 10;
byte b = 3;
byte i = (byte)s + b;
编译错误
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from int to byte
at DataType.main(DataType.java:8)
而若是将s与b先运算得出结果,再转为byte编译就不会报错,语法通过
short s = 10;
byte b = 3;
byte i = (byte)(s + b);
out.println(i);
编译器(javac)只检查语法与编译,并无任何代码执行
自动类型转换
10 / 3正确结果等于3.333333...,但以下输出结果是3.0,这是因为d变量的字面值是整数运算完成后的结果,而计算时10与3都是int类型,上面第六条提到: 多种数据类型混合运算时,先转换成容量最大的类型再做运算,所以最终结果计算为3并赋值给d
public static void main(String[] args){
double d = 10 / 3;
out.println(d);
}
而当10与3都为double类型时,结果为3.3333333333333335
public static void main(String[] args){
double a = 10.0d;
double b = 3.0d;
double d = a / b;
out.println(d);
}
到此可以得出一个结论,当字面值运算时,它的结果不一定与等号左侧数据类型相等,而我们看到的数据,是它们转换后的结果
总结
除Boolean外,其它七种基本数据类型可以互相转换
小容量转大容量叫做自动类型转换
char 和 short平级
大容量 转换成小容量叫做强制类型转换,强制类型转换需要加强制类型转换符(...)如(int),编译通过但是程序运行期可能会导致精度损失
所有学习资料均来自互联网,本人各种摘抄实验的结果
本文由 UpYou 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Nov 5,2020