结构体有一种定义方式叫做位域定义方式,如下:
struct ctl_register {
int a :16;
char c :4;
};
这种定义方法,一般常用在嵌入式开发的内核层的代码中经常出现。
int a :16; 代表a只占int的低16为,也就是a的取值范围0~0xffff ,如果在赋值的时候,a的值超过界限,那么只能舍弃前边的部分,只保留低16位
同理 char c :4; 就是c只占char类型的低4位,也就是c的取值范围0~0xff,如果越界舍弃
那么计算这样的数据结构大小就有点不太一样,这是按照位进行相加的,下面举几个计算的测试例子:
#include <stdio.h>
#include <stdlib.h>
typedef struct BitArea1
{
char c:4;
int l:30;
}BITAREA1;
/* 上面这个结构体的长度为:4bit+30bit=34bit,大于了一个字节(32bit),又因为:对齐规则的第2条:结构体或者类的自身对齐值:其成员中自身对齐