一、基本类型转换的两种方式
(1)自动类型转换——小类型到大类型的转换(自动完成,由JVM负责)
转换方向:byte→short→int→long→float→double
转换规则:符号位会自动扩展,负数补1,正数补0。
(2)强制类型转换——大类型到小类型的转换
语法:(要转换的类型)变量
注意:在使用+=,-=,*=,/=,%=运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显示的声明。
存在问题:①精度丢失②溢出(大类型转换小类型时,源数据的数据位变为目标数据的符号位)
二、强制类型转换的转换规则
原操作数的类型 | 转换后操作数的类型 |
---|---|
byte | char |
char | byte char |
short | byte char |
int | byte short char |
long | byte short char int |
float | byte short char int long |
double | byte short char int long double |
string | string |
注:在进行强制类型转换时可能会损失精度。
三、注意事项
(1)int直接量可以直接赋给byte、char和short,只要不超过其表示范围。
(2)byte、char、short三种类型参与运算时,先一律转换成int类型再进行运算。(Java在进行整数运算时,默认int型)
Java语言在涉及byte、short和char类型的运算时,首先会把这些类型的变量值强制转换为int类型,然后对int类型的值进行计算,最后得到的值也是int类型。因此,把两个short类型的值相加,最后得到的结果是int类型;如果把两个byte类型的值相加,最后得到的结果也是int类型。如果需要得到short类型的结果,就必须显式地把运算结果转换为short类型。例如:short s1 = 1;s1 = (short)(s1 + 1);有一种例外情况。“+=”为Java语言规定的运算方法,Java编译器会对其进行特殊的处理,因此,语句short s1 = 1;s1+ =1;能够编译通过。
(3)强制类型转换时可能会造成溢出或精度丢失。
//溢出
long l = 1024l*1024*1024*1024*4;
int j = (int)l;//产生溢出
System.out.println(j);//结果为:0
//精度丢失
double pi = 3.141592653589793;
float f = (float)pi;//造成精度丢失
System.out.println(f);//结果为:3.1415927
(4)任何数据类型碰到String类型的变量或常量之后都向String类型转换。