0
点赞
收藏
分享

微信扫一扫

位段(两个例题)

得一道人 2022-03-25 阅读 66
c语言

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不带括号

举报

相关推荐

0 条评论