目录
1.引例
#include <stdio.h> int main() { int n = 9; float *pFloat = (float *)&n; printf("n的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pFloat); *pFloat = 9.0; printf("num的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pFloat); return 0; }
这道题是如何输出的呢?如下:
从这道题可以看出整数和浮点数在内存中储存的方式是不同的,所以才造成输出的结果不同。
2.浮点数在内存中的储存
那么浮点数在内存中到底是如何进行存储的呢?
我们以8.5在x86环境下举例,8.5的二进制为1000.1,然后我们用科学计数法,1000.1 = 1.0001 * 2^3(因为是二进制,所以乘以2的次方),那么最后存储的方式就是:
0 10000010 00010000000000000000000,这32个比特位储存的就是浮点数8.5。
我们来解析一下:
我把32个比特位分成了三段,他们从前向后分别的含义是
S : 高位表示数字正负 0表示正数 1表示负数
E : 这里8bit表示的是2的次方的次方数的二进制+173
M :后面的23bit就是数字的主体,不过8.5的主体不应该是10001吗,为什么是0001呢?
原因是这里的28bit默认认为开头是1,所以把1省略,这样还能空出来1bit来进行存储。
3.题目解析
#include <stdio.h>
int main()
{
int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}
这里再回头重新看题目:
第一个 9 应该没什么问题,把int 的9 以%d形式打印
第二个 0 ----->
9的二进制 ----->1001 补全 ----> 00000000000000000000000000001001
这里如果用浮点数的形式打印,那么内存就认为打印的数是浮点数,那么其储存的形式就应该是浮点数的储存形式。根据上面的讲解,其第二部分E也就是2的次数+173为0,那么次数也就是-173,这明显是一个很小的数。把他还原成浮点数------> 1.1001 * 2^-173 ~ 0
第三个 初始化为一个浮点数,那么存储的时候就直接以浮点数的形式存储,
0 10000010 00100000000000000000000 ,若将这个二进制序列以%d的形式打印,其必然是个大数
第四个 以浮点数形式打印浮点数,正常输出9.0
4.完
浮点数在内存的储存方式就讲到这里,如果有不对请提出。
谢谢观看。