0
点赞
收藏
分享

微信扫一扫

【C语言】位段、位段的内存分配。

🚩write in front🚩   

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星TOP100~2022博客之星TOP63~作者周榜84﹣作者总榜704~阿里云专家博主 & 阿里云星级博主~掘金优秀创作者⇿InfoQ创作者⇿51CTO红人⇿全网访问量50w+🏅

🆔本文由 謓泽 原创 如需转载还请通知⚠

📝个人主页-​​謓泽51Ctop的博客​​📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

📣系列专栏-​​謓泽51Ctop的博客_【C语言】从0~1_51CTO博客​​🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

【C语言】位段、位段的内存分配。_位段

 位段 

说完结构体那么再来说说什么是位端的概念,以及位段是什么。

位段和结构体的声明都是类似的,但是有两点不同↓

  1. 位段的成员必须是 整形类型(int)、无符号整形类型(unsigned int)、有符号整形类型(signed int)
  2. 位段的成员名后面是有一个冒号:和数字的,当然在位段当中也是可以使用字符类型(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比特位。

位段的内存分配 

  1. 位段的成员可以是 int、unsigned int、signed int、char(本质上是属于整形的)类型。
  2. 位段的空间是需要按照(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...这些平台的实现都是不同的。

总结→和结构体相比,位段是可以达到同样的效果,具有很好的节省空间,但是它是有跨平台的问题存在的。


举报

相关推荐

0 条评论