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