1、Java中数据类型转换与内存溢出问题
2016-11-07 本文已影响260人
前端好有趣
默认转换(从小到大的转换):
如果有byte、short、char类型的数据参与运算的话,那么他们首先会转换为int类型。如果需要,然后以int-long-float-double这个顺序转换,byte、short、char相互之间不转换,他们参与运算首先转换为int类型
强制转换(从大到小的转换):
byte a = 3;
int b = 4;
byte c = ( byte ) ( a + b )
不要随意使用强制转换,从高精度到低精度,隐含了精度损失问题
注意:
byte b1 = 3, b2 = 4, b;
b = b1 + b2; //这个是错误的,因为两个byte数据参与运算,首先他们要转换成int类型,再作运算。
b = 3 + 4; //这个是正确的,先把结果计算出来,然后看是否在byte的范围内,如果在,就不报错。
内存溢出图解:
内存溢出图解为何
(byte)128=-128
(byte)129=-127
很简单,因为byte支持的范围为-128~127,所以只要想象这么一个循环图,以此类推就好了。
char类型的数据做运算,一定要记住这三个关键ASCII码值:
'a' 97
'A' 65
'0' 8
char a = '0', b = '1' , c;
c = a + b; //错误,a和b为char类型,相加前要先转换为
// int类型,a+b的结果为int类型,但c为char类型
c = (char) (a+b);
int d = a + b;
System.out.println(a); //值为'0'
System.out.println(b); //值为'1'
System.out.println(c); //值为'a'
System.out.println(d); //值为97
int-long-float-double顺序中的小“问题”:
他们分别所占字节数:
int 4、long 8、float 4、double 8
细心的小朋友就会发现,明明float所占的字节数比long小,为何float还排在long的后面,long表示的精度范围不应该比float大吗?
其实:他俩的底层储存结构不同,所表示的精度范围也不能以同一种标准来评判,float的储存方式详见如下链接
他俩的数据范围比较:
long:-2^63 ~ 2^63-1
float:-3.403×10^38 ~ 3.403×10^38
3.4×10^38 > 2×10^38 > 2×8^38 = 2×2338 = 2×2^114 > 2^63-1
float所表示的数据范围远远大于long
.
.