求以下程序的执行结果(小端存储):
#include<stdio.h>
#include<Windows.h>
#pragma pack(4)
int main()
{
unsigned char puc[4];
struct tagPIM
{
unsigned char ucPim1;
unsigned char ucData0:1;
unsigned char ucData1:2;
unsigned char ucData2:3;
}*pstPimData;
pstPimData = (struct tagPIM*)puc;
memset(puc,0,4);
pstPimData->ucPim1 = 2;//00000010
pstPimData->ucData0 = 3;//00000011
pstPimData->ucData1 = 4;//00000100
pstPimData->ucData2 = 5;//00000101
printf("%02x %02x %02x %02x\n",puc[0],puc[1],puc[2],puc[3]);
system("pause");
return 0;
}
程序分析:
一、创建一个含有四个unsigned char 类型数据的数组,如图所示(红色为区分四段八位unsigned char 空间):
二、创建一个结构体tagPIM,使指针pstPimData指向这个结构体,根据结构体对其规则可以得知该结构体的大小为两个字节,其中ucPim1占用一个字节,ucData0占用一个比特位,ucData1占用两个比特位,ucData2占用三个比特位。
三、使pstPimData指向puc,并初始化puc为零。
四、通过pstPimData给这段空间赋值,如图所示(黄色数据是初始值,绿色数据是通过pstPimData给这段空间重新赋值所得)。
五、得到结果:02 29 00 00(输出为两位十六进制整数)。
本文通过一个具体的C语言程序实例,探讨了小端存储模式下结构体成员在内存中的布局方式及位域的使用。通过对程序逐行分析,详细解释了如何将结构体成员的数据正确地放置到指定的内存位置,并最终输出结果。
643

被折叠的 条评论
为什么被折叠?



