问题: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为基数。 ↩︎