求以下程序的执行结果(小端存储):
#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(输出为两位十六进制整数)。