C语言 | 位段

位段是通过结构体来实现的一种以位(bit位)为单位的数据存储结构,它可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作,位段是一种节省空间的用法。

目录

声明

内存分配

跨平台 


声明

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

1.位段的成员必须是char、int、unsigned char 或 unsigned int 类型的。

2.位段的成员后面有一个" :"和一个数字。

比如:

struct A
{
	char _a:5;
	char _b:3;
	char _c:1;
	char _d:6;
};


内存分配

对于上述的例子,位段A在内存中所占用的大小是多少?

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


位段里每一个成员冒号后面的数字,代表其在内存中占用多少比特位。我们知道,一个char类型变量占用8比特位 ( 一个字节 ) ,若是char _a:3的话,则是占用8比特位中的其中三个比特位,要注意的是,冒号后面的数字大小不能超过该成员类型的大小的。

下面,我将用一张图片解释位段成员在内存中的分配,我们以位段B为例:

#include <stdio.h>
struct B
{
    char _a:3;
    char _b:4;
    char _c:5;
    char _d:4;
};

int main()
{
    struct B b = {0};
    b._a = 10;
    b._b = 4;
    b._c = 3;
    b._d = 12;
    return 0;
}

假设数据在内存中以小端字节存储,_a的值为10,二进制为00001010,而_a的位段为3,则取3比特位存储在内存中,即010。

1字节=8比特位,_a 和 _b 用了 7 比特位,而_c 需要占用5比特位,剩下的1比特位不够存储,则在内存中在下一字节处开始存储 _c 的数据。



跨平台 

位段跟结构体很像,结构体的内存对齐跟平台的兼容性有一定关系,那么位段的内存对齐是否也有跟平台有关的问题需要注意下呢?

1. int 位段被当成有符号数还是无符号数是不确定的。

2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。

3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。

跟结构体相比,位段可以更好地省内存空间,但是在跨平台上存在一定的问题 。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值