知识补充(1)-位域

本文介绍了C语言中的位域概念,位域允许在结构体中定义变量占用特定位数,从而节省存储空间。文章讨论了位域的压缩存储、内存对齐原则以及不同编译器对位域处理的差异。通过举例说明了位域如何影响结构体大小的计算,对于嵌入式领域的开发者具有参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天在牛客上找到了前几天做的有关c语言的题,发现这个题涉及到了位域的知识,之前也没接触过这样的知识,故前去学习,并进行总结,发了这篇文章,方便之后再进行复习。

292bc84945cd498e806eae05b64f714f.jpg

        位域可以用在嵌入式领域,在结构体中定义,可以在数据存储时节省空间。

        在c语言标准中(ANSI C)支持的是unsigned int与int。有的编译器进行了拓展,支持其它类型的如char等。

        在结构体的成员变量后面加上“:”再在后面加上你所定义的变量所占的位数(bit),这样就可以让一个本来应该占4字节32位的变量占你希望它占的位数(不能超过数据类型本身大小,如int的32位,冒号后面不能超过32),这也就是位域。

        如果多个这样定义的变量在一起,会进行压缩存储,直到多个变量占空间之和大于数据类型代表空间时就会进行偏移,偏移量为数据类型所占空间大小的整数倍。当定义位域的变量中间有非位域变量,则不会进行压缩存储。而不同类型变量定义的位域是否被压缩存储取决于你的编译器(gcc会压缩,vc不会)。

        上面那道题三个int类型变量在一起,位域分别为3,4,5,相加12位不超过int类型的32位,所以就相当于占了一个int的大小4个字节(进行了压缩存储)。又根据内存对齐原理,知道这个结构体中每个存储单元为8字节(double),所以前三个变量共占8字节,与后面double类型8字节相加,共占16字节。

        如果第二个定义的位域是29,那么就应该占两个int的大小,因为前两个变量经压缩存储后位域已经等于32,最后一个变量需要另开空间;如果第二个定义的位域为30,那前三个所占空间为3个int的空间,因为第二个变量既无法与第一个变量压缩存储,也无法与第三个变量压缩存储,都大于32,所以,前三个变量所占空间大小为3个int,即12个字节。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星如雪_梭如月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值