在C语言数据在内存中的存储一篇中我引出了这样一道引例,并由此介绍了浮点数是如何在内存中存储的,现在我们理论成立,实践开始,借助浮点数的存储方式来重新审视这道题:
#include<stdio.h>
int main()
{
int n = 9;
float* pf = (float*)&n;
printf("n的值为:%d\n", n);
printf("*pf的值为:%f\n", *pf);
*pf = 9.0;
printf("n的值为:%d\n", n);
printf("*pf的值为:%f\n", *pf);
return 0;
}
首先,第一个n为9毫无疑问,将一个整型以整型类型打印,二者相匹配所以打印出9.
对于pf来说,它是一个类型为float*的指针变量,它会站在float的角度看待内存中的n.
n=9;
//00000000 00000000 00000000 00001001 ——原码
//pf会以浮点数的角度划分n:
//0 00000000 00000000000000000001001
//S E M
//此时E为全0,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数。
//浮点数的指数E等于1-127(或者1-1023)即为真实值
//还原:(-1)^0*00000000000000000001001*2^126
//又因为%f打印小数点后6位的数字,所以*pf第一次打印的结果为0.000000
*pf=9.0;
//9.0(10)
//1001.0(2)
//(-1)^0*1.001*2^3
//S=0,M=1.001,E=3
//E存=3+127=130
//存到内存中去:
//0 10000001 00100000000000000000000
//n会以有符号整型的角度看待这组数据
//最高位0说明该数为正,所以原码,反码,补码相同。
//所以打印出的值就是1000000100100000000000000000000(2)
//1091567616
最后,将*pf以%f的形式打印,类型匹配,打印出9.000000也毫无疑问正确。
以上,便是对之前浮点数存储引例介绍,对于其中浮点数是如何在内存中存储不清楚的小伙伴可以移步我之前的内容——c语言数据在内存中的存储。