位段(位域)
位段也叫位域,位段会在结构体的基础规定每个成员变量的大小,大小的单位是二进制位。
在有些信息存储时,并不需要占用一整个字节,而只需要一个或几个二进制位的大小空间,例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。
所以相比于结构体存储这些较小的数据时,位段就可以很好的节省空间。
位段的声明
struct 位域结构名
{
type member_name : width ;
...
};
type:可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
member_name:位段的名称
width:位域所占的二进制位。宽度必须小于或等于指定类型的位宽度
代码示例
struct S
{
char a : 3;
char b : 4;
char c : 5;
char d : 4;
};
位段的内存分配
- 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型。
- 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
- 一个位域存储在同一个字节中,如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
- 位域的宽度不能超过它所依附的数据类型的长度,成员变量都是有类型的,这个类型限制了成员变量的最大长度,: 后面的数字不能超过这个长度。
代码示例
struct S
{
char a : 2;
char b : 3;
char c : 4;
char d : 5;
};
int main()
{
struct S s = { 0 };
s.a = 8;
s.b = 9;
s.c = 6;
s.d = 2;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/c7f51ff10e254b720d2c5698e6194fed.png)
![](https://i-blog.csdnimg.cn/blog_migrate/36991b8e14e5f4a2ae18e9ec42098b1d.png)
位段的跨平台问题
int 位段被当成有符号数还是无符号数是不确定的。
位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。)
位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。
总结:
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
本文出现任何错误,欢迎留言批评指正。