Java long和float的取值范围谁大谁小

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,即 最大值为2^127,远远大于long类型的最大值:2^63-1

猜你喜欢

转载自blog.csdn.net/weixin_44296929/article/details/106902749