当数据类型不同的变量进行赋值时,会发生数据类型转换。
数据类型转换有两种自动类型转换和强制类型转换。
自动类型你转换(隐式)
1.特点:代码不需要进行处理。
2.规则:数据范围从小到大。
public class Demo01DataType{
public static void main(String[]args){
System.out.println(1024);
long num1 = 100;
System.out.println(num1);
double num2 = 2.5F;
System.out.println(num2);
float num3 = 30L;
System.out.println(num3);
//long -->float,float的数据范围要大于long类型的数据范围,符合由大到小的规则
}
}
强制类型转换(显性)
1.特点:代码需要进行特殊处理,不能自动完成。
2.格式:范围小的类型 范围小的变量 = (范围小的类型) 原本范围大的变量
3.注意事项
强制类型转化一般不推荐使用,因为有精度损失,数据溢出。
byte、short、char都可以发生数学运算,在运算时会首先提升成int,然后运算。
boolean类型不能进行数据类型转化。
// 强制类型转换
public class Demo02DataType{
public static void main(String[]args){
int num1 =(int) 10L;
System.out.println(num1);
// 正确
int num2 =(int) 6000000000L;
System.out.println(num2);
// 不报错 但显示1705032704
// 如果数据本来就超过了容器的范围,那么就会装不下,出现溢出
int num3 =(int) 3.5;
System.out.println(num3);
// 3 不是四舍五入!
char zf1 = 'A';
int zf2 = (int) 'A';
zf1++;
System.out.println(zf1);//B
System.out.println(zf2);//65
// 计算机底层有一个数字(二进制),来表示字符A(65)
//一旦char类型进行数学运算,那么字符就会按照一定的规则(ASC编码)翻译成数字进行运算
byte num4 = 40;
byte num5 = 50;
// byte result1 = num4+num5;报错
// byte + byte--> int + int -->int
// 而result1是byte类型,强制转换,报错内容为:int转化为byte可能会有损失
// so
int result1 = num4+num5;
System.out.println(result1);
short num6 = 60;
// byte + short --> int + int -->int
short result2=(short)(num4+num6);
// int 强制转换位short:注意必须保证实际大小没有超过类型范围,避免溢出
System.out.println(result2);
}
}
tip:
逻辑上讲
byte num4 = 40;
byte num5 = 50;
byte result1 = num4+num5;
//byte + short --> int + int -->int
int 90转化为byte类型没有超出byte的最大范围,但是系统还是会提示报错
结论:强制类型转化要用对应的格式来操作,报错与是否溢出无关。
byte result1 = (byte)(num4+num5);