变量的类型转换
在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式不同,数据类型可分为两种:自动类型转换、强制类型转换
自动类型转换
也称为隐式类型转换,指两种数据类型在转换的过程中不需要显示地进行声明。此情况适用于当把一个类型取值范围小的数值直接赋给另一个取值范围大的数据类型变量。
数据类型取值范围大小
类型名 | 占用空间 | 取值范围 |
---|---|---|
byte | 8位(一字节) | ( − 2 7 , 2 7 − 1 ) (-2^{7},2^{7}-1) (−27,27−1) |
short | 16位(二字节) | ( − 2 15 , 2 15 − 1 ) (-2^{15},2^{15}-1) (−215,215−1) |
int | 32位(四字节) | ( − 2 31 , 2 31 − 1 ) (-2^{31},2^{31}-1) (−231,231−1) |
long | 64位(八字节) | ( − 2 63 , 2 63 − 1 ) (-2^{63},2^{63}-1) (−263,263−1) |
浮点数类型取值范围大小
类型名 | 占用空间 | 取值范围 |
---|---|---|
float | 32位(四字节) | ( 1.4 E − 45 , 3.4 E + 38 ) , ( − 1.4 E − 45 , − 3.4 E + 38 ) (1.4E-45,3.4E+38),(-1.4E-45,-3.4E+38) (1.4E−45,3.4E+38),(−1.4E−45,−3.4E+38) |
double | 64位(八字节) | ( 4.9 E − 324 , 1.7 E + 308 ) , ( − 4.9 E − 324 , − 1.7 E + 308 ) (4.9E-324,1.7E+308),(-4.9E-324,-1.7E+308) (4.9E−324,1.7E+308),(−4.9E−324,−1.7E+308) |
Java中支持不同数据类型之间的自动转换,如图:
例如:
byte b = 3;
int x = b; //程序把byte类型的变量b转换成了int类型,无需特殊说明
double y = x; //将int类型的变量x转换成了double类型,无需特殊说明
强制类型转换
也称为显示式类型转换,指的是两种数据类型之间的转换需要显式地声明。当两种数据类型彼此不兼容,或者目标类型取值范围小于源类型是,自动类型转换无法进行,这时就需要进行强制类型转换。
注意:
将取值范围大的数据类型的变量赋值给取值范围小的数据类型的变量是,有可能造成数据的丢失。
强制类型转换实例:
public class Example {
public static void main(String[] args) {
int num = 4;
byte b = (byte)num; //强制类型转换
System.out.println(b);
}
}
运行结果:
赋值运算符中强制类型转换的自动实现
在使用+ =,-=,*=,/=,%=运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显示的声明。
例如:
public class Example {
public static void main(String[] args) {
short s = 4;
int c = 5;
s += c;
System.out.println(s);
}
}
运行结果如下:
表达式类型自动提升
变量在表达式中进行运算时,也有可能发生自动类型转换,这就是表达式数据类型的自动提升。
public class Example {
public static void main(String[] args) {
short s = 4;
char c = 5;
byte b = 3;
byte b2 = (byte)(c + s + b); //此时进行强制类型装换
System.out.println(b2);
}
}
在表达式c + s + b 运算期间,s,c,b 都被自动提升为int型,表达式的运算结果也就成了int型,这时如果将该结果赋给byte型的变量就会报错,此时就需要进行强制类型转换。