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

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

位域的优点:

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 : %#xn",timeReg.TIM_Start_Stop);    printf("timeReg.TIM_Overflow : %#xn",timeReg.TIM_Overflow);    printf("timeReg.TIM_Div : %#xn",timeReg.TIM_Div);    printf("timeReg.TIM_Start : %#xn",timeReg.TIM_Start);    //打印timeReg的值  unsigned char* p = (unsigned char*)&timeReg;    printf("the data of struct storage value is %#xn",*p);}