Java基本数据类型易错点

最近又把javase中基础知识看了一遍,先将自己觉得易错的地方总结下。
一、面试题之变量相加和常量相加的区别
下面代码是否有问题

byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
byte b4 = 3 + 4;

b3类型转换出错,需强制转换成byte类型,b4正确
从两方面去回答这个题
b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值。
byte类型的变量在进行运算的时候,会自动类型提升为int类型。
所以将b1+b2得到的int类型赋值给b3需强制转换成byte类型。
而3和4都是常量,java有常量优化机制,在编译的的时候会直接把3和4的结果赋值给b4,所以b4没出错。
这就引出隐式转换与显式转换(强制转换)的问题

二、基本数据类型的隐式转换与显式转换(强制转换)
隐式转换:
取值范围小的数据类型与取值范围大的数据类型进行运算,会先将小的数据类型提升为大的,再运算;
显式转换:
将取值范围大的数据类型的数据赋值给取值范围小的数据类型,需进行强制转换,否则会报类型转换错误。强制转换如果超出了被赋值的数据类型的取值范围得到的结果会与你期望的结果不同。
总结为
进行混合运算的时候,byte,short,char不会相互转换,都会自动类型提升为int类型,其他类型进行混合运算的是小的数据类型提升为大的
byte,short,char –> int –> long –> float –> double
那么,都知道long类型为8个字节,float类型为4个字节,long类型和float类型谁大谁小呢?

三、long与float的取值范围大小比较
根据IEEE754的规定,float类型为4个字节,即32个二进制位,1位是符号位,8位是指数位,23位是小数位,从00000000到11111111,即指数的范围从0到255,0代表0,255代表无穷大,剩下的1-254每一个减去127,即-126到127。所以float表示的范围比long表示的范围大。

猜你喜欢

转载自blog.csdn.net/Shine_rise/article/details/61209030