原文链接:https://blog.csdn.net/weixin_44296929/article/details/106902749
1、Java中进行混合运算的时候,byte,short,char不会互相转换,都会自动类型提升为int类型,其他类型进行混合运算时,小的数据类型提升为大的数据类型。
下面进行简单的类型转换排序:byte,short,char(不互相转换)-> int -> long -> float -> double。
通过上面可以看出在混合运算是long会转换为float,而实际上long占八个字节,float只占四个字节,那么到底谁大谁小呢?
class DataTypeConversion{
public static void main(String[] args){
float f = 12.3f;
long l = 12345;
f = l;
System.out.println(f);
}
}
正常输入12345.0,可见float是可以存储long的值的。
class DataTypeConversion{
public static void main(String[] args){
float f = 12.3f;
long l = 12345;
l = f;
System.out.println(l);
}
}
编译出错:可能丢失精度。可以通过l = (long)f;来进行强制转换,可见long是装不下float的值的。
2、通过二进制来分析为什么八个字节的long比四个字节的float小:
float 占四个字节:
- 一个字节是八个二进制位,float四个字节相当于32个二进制位
- 最左边的1位代表的是符号位
- 后面的23位代表尾数位(小数位,最大也无非是无限接近于1,不影响其整个float的取值,可忽略不计)
- 剩下的8位(32 - 1 - 23)就是关键的指数位,二进制表示为:00000000 ~ 111111111 取值范围为0 ~ 255,
- 根据IEEE 754规定,其中0代表0,255代表无穷大,去除两个最值,中间的范围为1 - 254,
- 规定每个指数要减去127,所以范围为:-126 ~ 127,即 最大值为2127,远远大于long类型的最大值:263-1.