![](https://img-blog.csdnimg.cn/img_convert/cd6439ceb68dc5c47d279500df3d883f.png)
![](https://img-blog.csdnimg.cn/img_convert/27da7fb49115f3662c051bae381f3a97.png)
下面说float的存储方式
(-1)^S*(1.M)*2^E
举例来说:十进制数10.25,
首先化为二进制 1010.01,
然后用科学计数法化为 1.01001 * 2^3
因为它是正数,所以S取0,套用上面的模板,可以知道
S = 0
M = 01001
E = 3
接着对于float类型,E要加上127,所以E = 130
E的二进制序列为 1000 0010
最后得出10.25的存储数据为 0 10000010 01001000000000000000000
总结,
第一步,将浮点型化为二进制科学计数法的形式
第二步,找出S,M,E
第三步,对于float类型,E加上127;对于double类型,E加上1023
第四步,E变为二进制,就可以写出存储序列了,其中,M靠左写,往右补0
为什么对于float类型,E加上127;对于double类型,E加上1023呢
首先,E为一个无符号整数(unsigned int)
这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。
但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即
10001001。
如何计算一个小数的二进制序列呢
整数部分除2取余倒着写,小数部分乘2取整顺着写
以10.25为例
![](https://img-blog.csdnimg.cn/img_convert/41b747a56c5ced81f5b34e3f621e23c2.png)
整数部分:除到商0为止,为1010
![](https://img-blog.csdnimg.cn/img_convert/e21ae4a4eb20b49b39b41d7d1084bb44.png)
小数部分:乘到小数点后面是0为止,如果乘不出0,那就根据题意具体看要保留到几位,整数部分每次乘出1以后就把1丢掉,重新再用小数部分乘
这样就得出10.25的二进制序列为1010.01。