今天我们来探讨一下浮点数的内存存存储!
先来看一个例子:
int main()
{
int a = 9;
float *p = (float*)&a;
printf("%d\n", a);//以有符号十进制整形方式打印
printf("%f\n", *p);//以有符号十进制浮点数(float)方式打印
*p = 9.0;
printf("%d\n", a);//以有符号十进制整形方式打印
printf("%f\n", *p);//以有符号十进制浮点数(float)方式打印
system("pause");
return 0;
}
输出结果是什么呢?
是不是有点奇怪,为什么存入的是 9,以 %f 方式打印出来的却是0.000000
为什么存入的是 9.0,以 %d 方式打印出来的却是1091567616
我们猜测这应该就是浮点数在内存中的奇特存储方式导致的,那么现在就让我们来研究研究:
先让我们看看:为什么存入的是 9.0,以 %d 方式打印出来的却是1091567616
经过上图的分析,我们就明白了,原来浮点数在内存中存的仅仅是该浮点数二进制科学计数法表示中的
S((-1)的指数,代表符号位,0为正,1为负)【1bit】
E(进制的指数,代表小数点后移位数)【8bit】【存的时候自动+127,取得时候自动-127】
M(有效数的精度位,即只存小数点后面的精度位)【23位】【存的时候忽略小数点前的【1 .】,取时自动加上【1 .】】
现在我们在看看:为什么存入的是 9,以 %f 方式打印出来的却是0.000000
相信现在我们都很清楚了,这就是说,CPU取数据的时候是按照浮点数的形式取得,左移计算出来的值也就是浮点型了。
上面我们还要讨论一个关键的问题,那就是由上面可以看出浮点数和0比较时,不能直接用 == 和 0 比较,而应该这样比较:
32位机器:
看完 float(4字节)的存储,
现在再来讨论一下 double(8字节)(双精度浮点型)
注意两点即可:
1 float 中存 +127 double 中存 +1023
2 float 中S [1bit] E [8 bit] M [23 bit]
double 中S [1bit] E [11 bit] M [52 bit]