1、什么是位段
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段。利用位段能够用较少的位数存储数据。
2、位段在使用中需要注意的一些点:
1、位段的内存分配2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,即位段不能跨字节存储,比如在VC中int是占4个字节,那么最多只能是32位;
1.
位段的成员可以是
int unsigned int signed int
或者是
char
(属于整形家族)类型。
2.
位段的空间上是按照需要以
4
个字节(
int
)或者
1
个字节(
char
)的方式来开辟的。
3.
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
struct S {
char a:3;
char b:4;
char c:5;
char d:4;
};
struct S s = {0};
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
2、位段占的二进制位数不能超过该基本类型所能表示的最大位数,即位段不能跨字节存储,比如在char是占1个字节,那么最多只能是8位;
这里将_d设为9编译器直接报错
3、在位段中不给其起名字,无法访问该位段,但是计算大小是仍占空间。
struct A {
char _a : 2;
char _b : 5;
char _c : 8;
char : 8;
}s;
int main()
{
printf("%d", sizeof(struct A));
return 0;
}
输出结果为:
4、不可对位段进行取地址操作
struct A {
char _a : 2;
char _b : 5;
char _c : 8;
char : 8;
}s;
int main()
{
printf("%d\n", sizeof(struct A));
char *p = &(s._a);这里对位段中的元素取地址操作
system("pause");
return 0;
}
编译时直接报错:
5、如果位段中存储的数据大于位段自身大小就会发生截断问题(在vs2013中测试的结果),在输出时会将截断之后的最高位当作符号位。例:
struct A {
char a : 2;
char b : 5;
char c : 8;
char d: 8;
}s;
int main()
{
s.a = 7;//111
s.b = 51;//1 10011
//printf("%d\n", sizeof(struct A));
printf("%d\n", s.a);
printf("%d\n",s.b);
return 0;
}
![](https://img-blog.csdnimg.cn/53451d367d2544af97f80989543d7bad.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pyI5Y2K5pyo5pak,size_20,color_FFFFFF,t_70,g_se,x_16)
如果将位段的类型换为无符号的
struct A {
unsigned char a : 2;
unsigned char b : 5;
char c : 8;
char d: 8;
}s;
int main()
{
s.a = 7;//111
s.b = 51;//1 10011
//printf("%d\n", sizeof(struct A));
printf("%d\n", s.a);
printf("%d\n",s.b);
return 0;
}
输出结果为:
我们接下来再用u%输出试一下:
struct A {
char a : 2;
char b : 5;
char c :8 ;
char : 8;
}s;
int main()
{
s.a = 7;//111
s.b = 51;//1 10011
//printf("%d\n", sizeof(struct A));
printf("a:%u\n", s.a);
printf("b:%u\n",s.b);
system("pause");
return 0;
}
输出结果: