之前没发现,竟然有这么个东西。一般存储数据都是以byte为单位,如果要表示0或1,最小也只能用char;但char占用了8个bit,有7个是浪费的。下面写代码,看看位域是什么东西:
// sizeof : 4
typedef struct bit_filed
{
// 定义使用1个bit的位域,unsigned就是unsigned int
unsigned a : 1;
int b : 1;
};
sizeof一下这个结构体:
int main()
{
struct bit_filed bf;
printf("%d", sizeof(bf));
}
直接说结果吧:4,占用了4byte。
修改一下,再试试:
// sizeof : 2
typedef struct bit_filed
{
// 定义使用1个bit的位域
short a : 1;
short b : 1;
};
再修改:
// sizeof : 16
typedef struct bit_filed
{
// 定义使用1个bit的位域
long long a : 1;
short b : 1;
};
再修改:
// sizeof : 4
typedef struct bit_filed
{
// 定义使用1个bit的位域
short a : 1;
short b : 16;
};
再修改:
// sizeof : 4
typedef struct bit_filed
{
// 定义使用1个bit的位域
short a : 1;
// 无名位域,用于内存对齐,下一个位域将不会接前面的位域内存,即使还有空间
short : 0;
short b : 1;
};
- 位域的格式:type [name]:bit_length;
- 位域以type类型大小申请空间,若申请的空间足够填充之后的位域则不再申请空间;若不足则继续申请,与结构体对齐相同
- 无名位域用于内存对齐,无名位域不占用内存,但强迫下一个位域在内存分配边界对齐
- 位域的type只能是整数类型:char、short、int、long、long long等