1 引入
整数在计算机内存储存以二进制储存很容易理解,那浮点数怎么储存的呢?
其实之所以想到要一探究竟是因为类似下面这段代码:
#include <stdio.h>
int main(void){
int num = 5.75;
printf("%d",num);
return 0;
}
由于大意,用转义字符%d来打印浮点数,结果显示
为什么是-461808600呢?我也很奇怪,然后就开始研究研究吧。
当然这个也和编译器有关,有些就会强制类型转换,打印:5。
2 小数二进制十进制转换
在写如何储存之前不得插上一段二进制和十进制的互换(小数位):
例:十进制的 0.125 化为二进制是多少呢?
方法:将小数部分不断乘以2,每次取整数部分直到为1.
0.125×2=0.25 取0
0.25×2=0.5 取0
0.5×2=1 取1
即0.125(10)=0.001(2)
二进制转十进制呢?
方法:将二进制各位乘以2的负次方,相加即可,
0×1/2+0×1/4+1×1/8=0.125
3 浮点数储存
现在我们来看浮点数如何储存,按照IEEE 754标准进行存储,具体如下:
第一段 占 1bit,表示符号位。代称为 S(sign)。
第二段 占 8bits,表示指数位。代称为 E(Exponent)。
第三段 占 23bits,表示尾数位。代称为 M(Mantissa)。
S: 符号位 0代表正数 1代表负数
E: 指数位 ,对于任何数来说 都可以满足
比如:对于 5 来说,因为 4 < 5 < 8,所以 n=2,而 n=E−127 所以E就等于129
M: 尾数位 也就是小数位,尾数xxxx后面补零
这里以5.75为例:
将十进制转换成二进制,并转换位科学计数法表示:
5.75=101.11=1.0111×2^2
符号位:0(代表为正数)
指数部分为:2+127 = 129
尾数部分为:0111
所以:
指数位:129 = 1000 0001
尾数位:0111 0000 0000 0000 0000 000
完整二进制表示如下:
0 1000 0001 0111 0000 0000 0000 0000 000