阅读导航:
1.位段
1.1什么是位段
位段的声明和结构体是类似的,但是有以下的几个不同:
1.位段的成员类型必须是:int 、unsigned int 、signed int 、char ,不能是其他的变量类型,但是结构体没有的成员变量可以是任意类型。
2.位段的成员名后面有一个冒号和数字(位段的“位”表示的意思是二进制位,这个数字表示的是占了多少个二进制位,也就是占了多少个比特位)
struct A
{
int a : 2;
int b : 5;
int c : 10;
int d : 30;
};
A就是一个位段类型。
对于任意的变量类型,函数…… 我们都能够从地址,大小,使用方法,内存占用去慢慢了解它。
那么A的大小是多少呢?
int main()
{
printf("%d",sizeof(struct A));
return 0;
}

为什么是8呢?
理由:
a b c d一共占用了2+5+10+30=47个比特位,1byte=8bit,那么至少申请了4个字节的空间(32比特位),还剩下的15(47-32=15)个比特位的数据没有存,那么只好再向内存申请4个字节的空间(因为a b c d 都是int类型的),因此占用了8个字节的空间。
那么问题来了,假如我把位段改一下呢?
看代码:
struct A
{
int a ;
int b ;
int c : 10;
int d : 10;
};
int main()
{
printf("%d",sizeof(struct A));
return 0;
}
那么A到底是结构体还是位段呢?
A的大小应该怎么算呢?
其实是位段!!!只要成员的后面跟上了冒号和数字就是位段。
先看答案:

答案是A占用了12个字节的空间。
其实可以这样分析:
对于a b 都是int 类型的,并且a b后面并没有跟冒号和数字,那么就把a b堪称结构体的成员,a b占用的空间为8个字节。
对于c d,c d后面跟了冒号个数字,那么可以看成位段的成员,c d一共占用了20个比特位,又因为c d的类型都是int类型的,因此c d只需要向内存申请一个int类型的空间就足够存下20个比特位了。
因此A的大小是12个字节。
一般情况下,位段的成员里面是不能混用 char和int 类型变量的,是不建议使用的。
struct A { char a:1 ;//不要这样使用位段 char b: 1 ;//里面既有char又有int int c : 7;//这样不好确定位段占用空间的大小,不利于设计 int d : 8; }; int main() { printf("%d",sizeof(struct A)); return 0; }
1.2位段的内存分配
1.位段的成员是:int 、unsigned int、signed int、char类型
2.位段上的空间是需要按照4个字节(int)或者一个字节(char)的方式开辟的
3.位段涉及很多不确定性因素,位段是不可跨平台的,注重可移植性的程序应该避免使用位段。
下面用一段代码来分析位段的空间是如何开辟的:
struct S
{
char a : 3;
char b : 4;
char c : 5;
char d : 4;
};
int main()
{
struct S s = { 0 };
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
printf("%d",sizeof(struct S ));
return 0;
}
最低0.47元/天 解锁文章
371

被折叠的 条评论
为什么被折叠?



