看完就进阶的结构体完结篇3位段

承接上文,讲完了结构体我们就得来讲讲位段。

位段

结构体讲完就得讲讲结构体实现 位段 的能力。位段在这里仅作了解,包括和后面的联合枚举一样,都是有一定代码项目实操经验才会有深刻感受的。

位段(Bit Field)已经涉及是C/C++语言中的一种数据结构,它允许你在结构体或联合体中定义特定宽度的字段。位段的主要用途是节省内存空间,特别是在嵌入式系统或对内存使用有严格限制的应用中。

什么是位段 

位段的声明和结构是类似的,有两个不同:

1.位段的成员必须是 int、unsigned int 或signed int 。

2.位段的成员名后边有一个冒号和一个数字。

struct A
{
 int _a:2;
 int _b:5;
 int _c:10;
 int _d:30;
};

在这里A就是一个位段类型

那位段A的大小是多少?怎么计算呢?

printf("%d\n", sizeof(struct A));

C语言中,位段(bit fields)的大小和对齐方式取决于编译器和平台。不同的编译器可能会以不同的方式处理位段,因此 sizeof(struct A) 的结果可能因编译器和平台而异。

我们所说的位段,其实是二进制位。所以大家可以试着运行一下。

位段的内存分配

1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型

位段通常基于一个整数类型(如 int、unsigned int 等)分配内存。
编译器会将位段分配到一个或多个底层存储单元中。

2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

位段的总位数不能超过底层存储单元的位数。例如,如果底层类型是 int(通常是 32 位),则位段的总位数不能超过 32 位。

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

这里举个例子,可以看到我们这个位段已经创建好了,这里结构体定义了一片0的空间。


看图片里,我定义的a是10,那在二进制里面就是01010,但是位段只取三位,也就是说,我不管怎么样只取010为止。这里解释一下char 类型通常是 8 位(1 字节)。

具体思路:

s.a = 10;

a 是 3 位,最大值为 2^3 - 1 = 7。
10 的二进制是 1010,截断后保留低 3 位,即 010,值为 2。
所以 s.a 的实际值是 2。

s.b = 12;

b 是 4 位,最大值为 2^4 - 1 = 15。
12 的二进制是 1100,在 4 位范围内,无需截断。
所以 s.b 的实际值是 12。

s.c = 3;

c 是 5 位,最大值为 2^5 - 1 = 31。
3 的二进制是 0011,不用截断。
所以 s.c 的实际值是 3

s.d = 4;

d 是 4 位,最大值为 2^4 - 1 = 15。
4 的二进制是 0100,无需截断。
所以 s.d 的实际值是 4。

最后讲一下位段的跨平台问题

位段的跨平台问题 

1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的。也就是上图里面所空的空间那些是未知的。

了解一下就好。所以位段跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

位段的应用

这个图是什么意思呢?,也就是说32位的位段,是可以分为不同的意思的,就跟图书的编码一样,缺一个都不行,是有内在逻辑在里面的。

感谢观看,我决定把枚举那些放到下一篇。下一篇就是完结篇了。感谢大家的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值