C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C语言位段

C语言带你学会位段相关知识

作者:烽起黎明

这篇文章主要介绍了什么是位段,位段的声明和结构是类似的,位段的成员必须是 int、unsigned int 或signed int;位段的成员名后边有一个冒号和一个数字,本文有详细的代码案例,感兴趣的同学可以参考阅读

一、什么是位段

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

  1. 位段的成员必须是 intunsigned intsigned int
  2. 位段的成员名后边有一个冒号和一个数字
//结构体
struct A {
	int a;
	int b;
	int c;
	int d;
};
//位段
struct B{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};

然后我们sizeof去计算一下这个结构体的大小

printf("结构体大小:%d\n", sizeof(struct A));
printf("位段大小:%d\n", sizeof(struct B));

可以看到,结构体的大小是16,位段是8,二者为何会存在区别呢?原因在于这个: 2吗?

在这里插入图片描述

学习了位段的相关知识后你就知道了

二、位段的内存分配

首先来科普一下位段的相关知识📖

  1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节[int]或者1个字节 [char] 的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段

那从上面我们就可以提取出一些信息,知道了对于整型而言会开辟出4个字节的数据给到位段作为存放,那接下去呢我们就来分析一下这个位段

所以最后的结果就是4 + 4 = 8B

struct B{
		//4Byte - 32bit
	int _a : 2;		//30
	int _b : 5;		//25
	int _c : 10;	//15
		//4Byte - 32bit
	int _d : 30;
	//4 + 4 = 8
};

看了我上面的这样计算,你一定会有这些疑问

💬 第一次是32b用剩后的【15b】去哪儿了呢?

💬 _d使用的是【15b】+ 后面开辟出来的32b,还是只用到后面的32b呢?

💬 难道所有平台都是这样吗?有没有不一样的计算方法?

上面是很多同学在课后提出来的疑问,关于这些,你在看完了我下面的分析后就会明白了👇 内存图分析位段分布

接下去我就通过对位段进行分析,然后观察内存分布来揭晓上面究竟是如何计算的。

为了方便期间,这里换一组位段,但是换汤不换药

struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};

int main(void)
{
	struct S s = { 0 };
	s.a = 10;
	s.b = 12;
	s.c = 3;
	s.d = 4;
	return 0;
}

在这里插入图片描述

然后我们来逐一分析一下💻

那我们假设一下,从右边往左边放,那么a放完后就是b,占4个比特位,但是放c的时候就放不下了,所以需要在开辟1个字节的空间,此时d再来放的话也放不下了,所以也要再开辟1个字节 ,最后也就需要3个字节的空间

在这里插入图片描述

详细分析如下】:

接下去我们就根据main函数中对位段各变量的初始化,来看看位段在内存中的分布情况:a的初始值为10,不过这是十进制,转换为二进制形式的话就是[1010],转看位段这里a变量的是占了3位,所以会截断成010,将它放到第一个字节处的右边3个比特位处

上面只是我假设的编译器执行思维,不过真正是怎样的,我们还是要求证一下

可以看到,确实和我们分析得是一模一样✌

在这里插入图片描述

看完了上面这个,相信你对一开始的那个位段如何去进行求解的整个流程应该是非常清楚了,留给读者自己的分析观察🔍

三、位段的跨平台问题

接下去我们再来讲讲有关位段的跨平台的问题

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

在这里插入图片描述

四、位段的应用

清楚了位段的相关知识和使用后,可能还是有同学比较迷惑这个位段到底是用来干嘛的,有什么实际应用场景吗?我们来看看

在这里插入图片描述

五、总结与提炼

最后来总结一下本文所学习的内容📖

到此这篇关于C语言带你学会位段相关知识的文章就介绍到这了,更多相关C语言位段知识内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文