位域的优点:
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);
}