如何通过C语言查看浮点数与有符号数在内存中的存储方式
题目要求
一、前言
考虑到题目中所要检验的float型数据与int型数据在内存中均占4个字节,遂想到可以借助C语言中联合体的特点,方便地查看两种类型数据在内存中的存储方式。为了不再赘述,本解答将思考题2.1与思考题2.2一并作答。
二、程序源码与结果展示
#include<stdio.h>
#include<stdlib.h>
union
{
float floatdata;
int intdata;
unsigned int bytedata;
} data;
int i=0;
void datatest(unsigned char* p)
{
printf("以16进制输出数据结果为: %x\n",data.bytedata);
printf("由低地址到高地址以十六进制输出: ");
for(i=0;i<4;i++)
{
printf("%x",*(p+i));
}
printf("\n");
printf("由高地址到低地址以十六进制输出: ");
for(i=3;i>=0;i--)
{
printf("%x",*(p+i));
}
printf("\n");
}
int main()
{
data.floatdata= 209.125;
unsigned char* p= (unsigned char*)&data.floatdata;
printf("思考题第一题解答(以209.125为例):\n");
datatest(p);
data.intdata=-209;
printf("\n思考题第二题解答(以-209为例):\n");
datatest(p);
system("pause");
return 0;
}
三、程序代码解析
程序中定义了包含float、int与unsigned int型数据的联合体data。
①在程序执行时,首先为联合体中float型成员floatdata赋值209.125,此时联合体data所占存储区为209.125的存储形式;
②通过打印输出联合体中unsigned int型数据bytedata的值就可以直观的看到209.125在内存中的存储形式;
③通过定义一个指向floatdata的指针(默认指向首地址),将此指针做自增或自减运算,便可将209.125在内存中的存储由低地址到高地址输出或由高地址向低地址输出;
④当检验完成float型数据后,再为联合体中int型成员intdata赋值-209,此时联合体data所占存储区为-209的存储形式;
⑤与检验float型数据时类似,通过打印输出联合体中unsigned int型数据bytedata的值就可以直观的看到-209在内存中的存储形式;
⑥将-209在内存中的存储形式由低地址到高地址输出或由高地址到低地址输出,同样使用指针自增与自减的方法,需要额外说明的是,因为联合体中所有数据类型均共用一段内存,因此无需再额外定义指向intdata的指针q,直接利用现成的已经定义了的指向floatdata的指针q即可。
四、结果分析
由终端输出结果可知,
1.浮点数在内存中的存储符合IEEE标准
2.有符号数在内存中是以补码形式存储的
3.在我所使用的拯救者Y7000电脑上,是小端法存储数据的(即高地址存储数据高位,低地址存储数据地位)