自动类型提升
1.boolean不允许进行类型转换
布尔类型boolean占有一个字节,由于其本身的特殊含义,使得与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换),否则将编译出错。
2.数值范围小的类型→数值范围大的类型,JVM在编译过程中负责对数值类型进行自动提升
byte a = 1000; // 编译出错 Type mismatch: cannot convert from int to byte float b = 1.5; // 编译出错 Type mismatch: cannot convert from double to float byte c = 3; // 编译正确
【例外】前两句很好理解,但int赋值byte类型编译正确是因为:
int→(byte/char/short)的类型转换在一定条件下不需强制转换
JVM 在编译过程中,默认为int类型的数值赋值给一个比int型数值范围小的数值类型变量(在此统一称为数值类型k,k可以是byte/char/short类型)会进行判断,若此int型数值超过k的范围,则会直接编译出错。但若此int型数值尚在数值类型k范围内,jvm会自定进行一次隐式类型转换,将此int型数值转换成类型k。
3.byte→char,char→short不进行自动类型提升
由于数值范围的原因,使得byte、short与char之间无法进行类型转换,但byte可以提升至short类型。
4.数据的默认类型
Java中,整数类型(byte/short/int/long)对于未声明数据类型的整形默认为int 类型 ;浮点类型(float/double)默认为double类型。
long a = 10000000000; //编译出错: The literal 10000000000 of type int is out of range
10000000000默认数据类型是int,而int的数值范围是-2^31 ~ 2^31-1,显然超出范围,所以编译报错,这里只需要申明自生默认类型即可。-----long a = 10000000000L; //编译正确
数值类型的强制转换
1.强制类型转换一数值类型转换至范围更低,可能会丢失精度
byte p = 3; // 编译正确:int到byte编译过程中发生隐式类型转换 int a = 3; byte b = a; // 编译出错:cannot convert from int to byte byte c = (byte) a; // 编译正确 float d = (float) 4.0;
分析:b=a编译报错是因为 a是变量,编译期无法确定。
2.强制类型转换的原理分析
int a = 233; byte b = (byte) a; System.out.println("b:" + b); // 输出:-23
分析:233的二进制表示为:24位0+11101001,byte只有8位, 从高位开始舍弃得到:11101001,由于最高位为符号位,1表示负数,其相应数值表示为-23。
3.进行数学运算时,数据类型会自动提升到运算符左右之较大者
byte e = 10, f = 11; byte g = e + f; // 编译错误 +直接将10和11类型提升为了int byte h = (byte) (e + f); //编译正确
关于强转丢失精度的相关底层原理可查看