🚩write in front🚩
🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星TOP100~2022博客之星TOP63~作者周榜84﹣作者总榜704~阿里云专家博主 & 阿里云星级博主~掘金优秀创作者⇿InfoQ创作者⇿51CTO红人⇿全网访问量50w+🏅
🆔本文由 謓泽 原创 如需转载还请通知⚠
📝个人主页-謓泽51Ctop的博客📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏-謓泽51Ctop的博客_【C语言】从0~1_51CTO博客🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩
位段
说完结构体那么再来说说什么是位端的概念,以及位段是什么。
位段和结构体的声明都是类似的,但是有两点不同↓
- 位段的成员必须是 整形类型(int)、无符号整形类型(unsigned int)、有符号整形类型(signed int)
- 位段的成员名后面是有一个冒号:和数字的,当然在位段当中也是可以使用字符类型(char)的,因为它实际上也是整形类型的一种。
- 那么下面来说说位段是什么样子的,如下代码所示↓
那么下述代码当中这个结构体B就是一个位段类型。
#include<stdio.h>
struct S
{
int a : 2; //(1)
int b : 5; //(2)
int c : 10;//(3)
int d : 30;//(4)
};
int main(void)
{
printf("%d\n", sizeof(struct S));
return 0;
}
运行结果↓
8
- a 占 两个比特位。
- b 占 五个比特位。
- c 占 十个比特位。
- d 占 三十个比特位。
那么在上述一共有四十七位比特位。在这里我们要直到1个字节 = 8比特位。
位段的内存分配
- 位段的成员可以是 int、unsigned int、signed int、char(本质上是属于整形的)类型。
- 位段的空间是需要按照(4个字节int)或者是(1个字节char)的方式来进行开辟空间。
- 在位段当中是不涉及跨平台的,如果你是在跨平台当种的话是不介意使用位段的。
struct S
{
int a : 2; //(1)
int b : 5; //(2)
int c : 10;//(3)
int d : 30;//(4)
};
首先看到 int a 开辟4个字节,有32个比特位。那么 abc 加起来一共有17个比特位。
那么我们用 32 🗡 17 = 15,那么这里就还有15个比特位。
在这里15个比特位不够 int b 当中的30个比特位,那么就再开辟4个字节为32个比特位存放 int b 当中的30个比特位。
那么在这里我们到底是用了32个比特位当中,还是先用到15个比特位再用到32个当中的比特位。 这个实际上在C语言当中是不确定的因素,因此为什么说位段是不跨平台的。因为在不同的平台下的实现方法是不一样的,gcc、vs、dev...这些平台的实现都是不同的。
总结→和结构体相比,位段是可以达到同样的效果,具有很好的节省空间,但是它是有跨平台的问题存在的。