位段(两个例题)

1. 

int main()
{
	unsigned char puc[4];
	struct tagPIM
	{
		unsigned char ucPim1;
		//下面为位段共用1字节
		unsigned char ucData0 : 1;//1
		unsigned char ucData1 : 2;//00
		unsigned char ucData2 : 3;//101
	}*pstPimData;
	pstPimData = (struct tagPIM*)puc;
	memset(puc, 0, 4);
	pstPimData->ucPim1 = 2;
	pstPimData->ucData0 = 3;
	pstPimData->ucData1 = 4;
	pstPimData->ucData2 = 5;
	printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
	return 0;
}

ucData0,1,2分别占1个比特位,2个比特位,3个比特位。因此共占1个字节

下面将其分别赋值为3,4,5对应二进制为0011,0100,0101,但这样赋值会越界,所以会发生截断,再按顺序进行填充就是101001,转化为十六进制就是0x29。

打印出来的结果就是02 29 00 00

2.

//#define MAX_SIZE A+B   //当a=2,b=3时
//struct _Record_Struct
//{
//	unsigned char Env_Alarm_ID : 4;
//	unsigned char Para1 : 2;//2+4=6不够8位  合起来占1个字节
//	unsigned char state;//正好一个字节,但不能去挤前面剩下的一个字节,而是要单独开辟出一个字节
//	unsigned char avail : 1;//1个比特位,但是也单独占一个字节
//}*Env_Alarm_Record;
//struct _Record_Struct* pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);

sizeof(struct _Record_Struct) * MAX_SIZE这个语句其实是进行宏替换即3*  2+3,即直接将MAX_SIZE换为2+3不带括号

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值