对于位段的概念,想必大多数的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语言中没有明确的规定!所以,笔者也不能准确的说出来!!尴尬