位段的基础知识(大家都不怎么知道位段)

举报
念君思宁 发表于 2023/02/13 13:13:16 2023/02/13
【摘要】 位段的基础知识(大家都不怎么知道位段)

对于位段的概念,想必大多数的C语言学者,都是不知道的吧!包括笔者在之前也不知道!!对于位段,还是笔者在深扒中,偶然间接触到的!!通过对位段的短暂学习,感概良多!收获满满,所以,笔者在此打算,写一遍关于位段的文章,来带领大家,了解一下位段的基础知识!!

1.什么是位段??

其实,位段是基于结构体来实现的!!

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

1.结构体的成员必须是:int ,unsigned ind, 或者signed int ,char 等类型,

2.位段的成员名后面有一个冒号(:)和一个数字!!

 下面我们通过一个结构体与位段的代码,来带领大家走进位段!!

#include <stdio.h>
 
struct s
{
	int a;
	int b;
	int c;
	int d;
};
 
struct a
{
	int a1 : 2;
	int b1 : 5;
	int c1 : 10;
	int d1 : 30;
};
 
int main()
{
	printf("结构体struct s的大小为:%d\n", sizeof(struct s));
	printf("位段  struct a的大小为:%d\n", sizeof(struct a));
	return 0;
}

上面的代码的运行结构为:

 但是,疑问随之而来!对于位段sizeof(struct a)的运行结果:为什么会是:8呢??

在这个之前,我们需要知道的是:段的,指的是:二进制位!!

因此,对于位段中的结构变量:int a1 : 2;  说明a1成员需要两个比特位!    int b1 : 5;  说明b1成员需要个比特位!!    int c1 : 10;  说明c1成员需要10个比特位!    int d1 : 30;  说明d1成员需要30个比特位!!则,一共需要:2+5+10+30=47个比特位,但是,一共字节,为8个比特位,所以开辟6个字节即可!但是,最后的结果却是开辟了8个字节!!这个又是为什么呢??


详解部分

对于一个int整型,4个字节,32个比特位,在程序刚刚开始时候,a1使用了2个,结束时候,还有32-2=30个,在供b1使用,b1使用完,还剩30-5=25个比特位,在供c1使用,c1使用完,还剩余:25-10=15个比特位,但是15个比特位不够d1的30个比特位使用,故,又申请了32个比特位,供d1使用!!即,总共开辟了8个字节!!


但是,在其中,有着15个比特位不够用,然后又申请了32个比特位,其中是怎样使用的呢???

经过文献的查阅,发现:这个是不确定的,在C语言中没有明确的规定!所以,笔者也不能准确的说出来!!尴尬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。