位段
百度百科对于位段的解释是这样的:
位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。
声明位段
- 位段的成员必须是
int
、unsigned int
、char
。 - 位段的成员名后边有一个冒号和一个数字。
#include <stdio.h>
struct C{
int a : 2; // 2位
int b : 5; // 5位
int c : 10; // 10位
int d : 30; // 30位
};
int main () {
printf("%d" , sizeof(struct C));
return 0;
}
位段分配空间
struct C{
char a : 2;
char b : 3;
char c : 4;
};
int main () {
struct C c = {0};
c.a = 3;
c.b = 4;
c.c = 5;
return 0;
}
位段的跨平台问题
int
位段被当成有符号数还是无符号数是不确定的。- 位段中最大位的数目不能确定。(
16
位的机器最大16
,32
位机器最大32
,写成27
,在16
位机器会出问题)。 - 位段中的成员在内存中从左往右分配,还是从右向左分配C语言标准未定义。
- 当一个结构包含两个位段。第二个位段成员较大,无法容纳第一个段位剩余的位时,是舍弃剩余位还是利用,是不确定的。
注:和结构体相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题。