问题:float是32位,long是64位,为什么float表示的范围比long大呢?
原因:
原因是,float与long在内存中的存储方式不一样。
long在内存中直接用64为存储:
long在内存中是用64为存储,所以大小为-2^63 ~ 2^63-1。
然而float是用浮点数表示法表示的,如下:

float计算公式:(-1)s*M*2E 1
由于单精度的阶码E是8位,尾数M是23为,数符是1位
尾数M是一个定点小数,其表示如下:

计算方法为:
-[1-2-(n-1)]~+[1-2-(n-1)]
所以float的最大值为:(1-2-22)*2127 (127是28-1-1),这里远超263了,所以float的表示范围大于long。这个就是为什么宽化类型转换时可以从long或int转换为float的原因。下面这个不会报错

参考
(N)R=(+/-) mn-1…m0.m1…m-k=(+/-)M*R(+/-)E,M为尾数,E为阶,R为基数。 ↩︎
本文详细解释了为何32位的float类型能表示的数值范围超过64位的long类型。通过对比float的浮点数表示法与long的直接存储方式,揭示了float类型利用指数和尾数实现更广范围表示的秘密。
171万+

被折叠的 条评论
为什么被折叠?



