C · 进阶 | 位段
【摘要】 结构体讲完就得讲讲结构体实现位段的能力,位段就像结构体的一种变形,相信很多铁汁都没有听说过,不着急,现在来学学看把~
啊我摔倒了..有没有人扶我起来学习....
你好,我是CGod,每个人都可以5分钟编程。
欢迎来到我的主页:《CGod的后花园》
前言
- 结构体讲完就得讲讲结构体实现 ==位段== 的能力
- 位段就像结构体的一种变形,相信很多铁汁都没有听说过,不着急,现在来学学看把~
位段
1.1 什么是位段
- 位段的声明和结构是类似的,有两个不同:
- 位段的成员必须是
int
、unsigned int
或signed int
- 位段的成员名后边有一个冒号和一个数字
- 位段的成员必须是
比如:
struct A
{
int _a : 2;
int _b : 5;
int _c : 10;
int _d : 30;
};
A
就是一个位段类型。那位段A
的大小是多少?
printf("%d\n", sizeof(struct A));
输出结果:
1.2 位段的内存分配
- 位段的成员可以是
int
,unsigned int
,signed int
或者是char
(==属于整形家族==)类型 - 位段的空间上是按照需要以
4
个字节(int
)或者1
个字节(char
)的方式来开辟的 - 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
#include<stdio.h>
//一个例子
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;
//空间是如何开辟的?
return 0;
}
- 根据上述代码,我们假设位段是这样分配内存的
- 那么我们再打开调试,内存窗口看看,是不是最终按我们分析的十六进制显示
- 哇塞还真是,但是这只是在
VS2019
的编译器下实现的
1.3 位段的跨平台问题
int
位段被当成有符号数还是无符号数是不确定的。- 位段中最大位的数目不能确定。(
16位
机器最大16
,32位
机器最大32
,写成27
,在16位
机器会出问题) - 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的
- 总结:
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)