自动类型转换

自动类型转换是指容量小的数据类型可以被计算机自动转换为容量大的数据类型。如图所示,黑色的实现表示无数据丢失的自动类型转换,而虚线表示正在转换时可能有精度的损失。

1494906265693111.png

可以将整型变量直接赋值给byte、short、char等类型变量,而不需要进行强制类型转换,只要不超过其表数范围即可。

【相关示例1】:

short b = 12; //合法
short b = 1234567; //非法,1234567超出了 short 的表数范围 -2^15~2^15-1

【相关示例2】:

int a = 324; //变量建立合法的,int的表数范围是 -2^31~2^31-1(约21亿)

long b = a;  //类型转换合法且无损的,long的表数范围是 -2^63~2^63-1(约92亿)

double d = b; //合法转换类型,但是由精度损失风险,表数范围是 -2^63~2^63-1(约92亿)

强制类型转换:

使用方法:

类型 新变量名 = (类型)需要转换的变量名;

需要注意:
1.计算机为我们自动转换之外,我们手动的强制转换,会有精度损失风险。

【相关示例3】:

int x = 100;
byte bx = (byte)x;  //结果=44


关于基本类型转换时常见错误和问题

常见问题一:
操作比较大的数时,要留意是否溢出,尤其是整数操作时。

int money = 1000000000; //10亿    
int years = 20;    
//返回的total是负数,超过了int的范围。    
int total = money*years;    
System.out.println("total="+total);    
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long,但是已经发生了数据丢失。    
long total1 = money*years;     
System.out.println("total1="+total1);    
//返回的total2正确:先将一个因子变成long,整个表达式发生提升,全部用long来计算。    
long total2 = money*((long)years);     
System.out.println("total2="+total2);    

运行结果如图所示:
2934.png

常见问题二:

关于L和l 的问题:

1.不要命名名字为l的变量,l容易和1混淆。long类型使用大写L
2.不要用小写。

int l = 2; //分不清是L还是1,
long a = 23451l;//建议使用大写L
System.out.println(l+1);