我们已经知道了在C语言中每个类型的数据生成时都会在内存上开辟一个属于自己的空间从而存储,了解了基本的数据的存储后,我们来一起学习浮点数的存储方法;
浮点数的存储不同于任何一种数据的存储;
浮点数的存储方式十分特别,这与浮点数本身的数据特点有关;
在这里我们主要学习浮点数中的float 和 double 类型的存储。
我们通过一段代码来引入:
#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;
}
我们看完这段代码后,最初在心中是有一个答案的,不管正确与否;
结果:
结果为何会是这样?
要搞清楚为什么,我们一定要知道浮点数在内存上面的存储方式;
根据标准规定:任意一个二进制的浮点数可以表示V
在理解完上面的之后,在这里介绍有关存储的更为细节的地方:
对于M,我们已经知道了,它无论如何都有一个整数部分 1,那么有规定:存M的那些个比特位不在存储这个整数部分1,而是去存储M的小数部分,这样扩大了M的存储范围。原本存储23个的,实际上存储了24个;
浮点数取出来的过程:在这里E的情况很特别,我们具体来看指数部分E是如何取出来的:
第一种情况:在E不全为0或是不全为1的时候:直接减去127或者是1023就可以得到E的真实值;
第二种情况:在E全为0的时候:这时候取出就直接取E是(1-127)或者是(1-1023),同时,有效数字M也不再加上第一位的1,而是还原成0.xxxxxx的小数,这样是为了表示正负0,或者很接近于0的小数;
第三种情况:在E全是1的情况下:此时若有效数字M全为0,则表示正负无穷大,这里的正负号取决于S
回归到最初的那个代码:
#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;
}
我们看到n的地址被转换成float*的类型的那一行,通过上面的学习我们已经知道了flaot的存储方式,它是极其区别于int型的存储方式,在内存上,原本是:
00000000000000000000000000001001,指向这个值的指针类型被转换之后
第一个0是符号位,(-1)^0说明是正的,后8位全为0,那么取出来的时候,M不会加上1,也就是
本次分享结束啦,不解或是有任何问题都可以私信我哦!谢谢。