从一个例子说起:
int main(void){
union{
int i;
struct{
char a : ;
char b : ;
char c : ;
}bits;
}num;
printf("Input an integer for i(0~15): ");
scanf("%d", &num.i);
printf("i = %d, cba = %d %d %d\n", num.i, num.bits.c, num.bits.b, num.bits.a);
return ;
}
输入i值为11,则输出为i = , cba = - - -。 为什么?
,位域的定义
在结构体的定义中,指定元素所占用的bit数, 并指定类型。 按照结构体的成员调用方式进行调用。
,位域的内存对应规则
一个字节按照从高位到低位 bit7 ~ bit0,对于位域的定义,是从低位bit0 开始算起的(注意不是从高位开始对应)。也就是说,上面例子中的位域,在一个字节中对应的存储是 ccba, a在最低位,然后是b,和占两个bit的c。 c成员中按照bit3高位、bit2低位存储。
,大小端问题
对于小端来说,低字节存放在低地址中,int的存储从0x00地址到0x03地址,依次是 。
联合体从头开始,是对内存中数据的截断和强转