×

抖音网红

位域结构体占用空间(关于结构体里面嵌套结构体)

douyinfenxiang douyinfenxiang 发表于2024-01-18 14:24:24 浏览18 评论0

抢沙发发表评论

位域的优点:

1、有些信息在存储时,并不需要占用一个完整的字节,而只需要占几个或一个二进制位。例如存放一个开关量时,只有0和1两种状态,用一位二进制即可。这样不仅节省空间,而且处理简便。这样就可以把几个不同的对象用一个字节的二进制位域来表示;

2、可以很方便地利用位域把一个变量按位分解,比如只需要4个大小在0-3的随机数,就可以只rand()一次,然后每个位域取2个二进制位即可,省时省空间。

位域的缺点:

不同系统对位域的处理可能有不同的结果,如位域成员在内存中是从左向右分配的还是从右向左分配的(大端小端),所以位域的使用不利于程序的可移植性。

typedef struct {
    unsigned char TIM_Start_Stop : 1;//起始位,占1位
    unsigned char TIM_Overflow : 1;
    unsigned char TIM_Div : 4;
    unsigned char TIM_Start: 2;//最高位,占2位
}TimReg_t;

int main(int argc, const char * argv[]) {
  TimReg_t timeReg;
    timeReg.TIM_Start_Stop = 0b1;
    timeReg.TIM_Overflow = 0b0;
    //timeReg.TIM_Div = 0b1001;
    timeReg.TIM_Div = 20;//会报警告,超过4位,会从最低位截取4位,高位被抛弃
    timeReg.TIM_Start = 0b01;
  	//打印timeReg的成员变量16进制值
  	printf("timeReg.TIM_Start_Stop : %#x\n",timeReg.TIM_Start_Stop);
    printf("timeReg.TIM_Overflow : %#x\n",timeReg.TIM_Overflow);
    printf("timeReg.TIM_Div : %#x\n",timeReg.TIM_Div);
    printf("timeReg.TIM_Start : %#x\n",timeReg.TIM_Start);
    //打印timeReg的值
  	unsigned char* p = (unsigned char*)&timeReg;
    printf("the data of struct storage value is %#x\n",*p);
}