(C语言)关于位段空间的使用情况的经典面试题解析

  求以下程序的执行结果(小端存储):

#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(输出为两位十六进制整数)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值