位段的内存分配

        对于位段,笔者在上篇文章中,已经详细的讲解了:位段的基础知识!!下面笔者来带领大家,学习一下:位段的内存分配!请大家紧跟步伐!!


在此之前,还需要各位老铁知道一下基础知识:

1.位段的成员可以是:int  ,unsigned int ,signed int ,或者,char (属于整型家族)类型!

2.位段的空间是按照需要以4个字节(int )或者1个字节(char)的方式开辟的

3.位段涉及很多不确定的因素,位段是不跨平台的,注意课移植的程序应该避免使用位段!


下面笔者简单通过一个位段代码解析来带领大家走进:位段的内存分配!!


#include <stdio.h>

struct s
{
	char a : 3;  //3指的是:a占3个比特位
	char b : 4;
	char c : 5;
	char d : 4;
};

int main()
{
	struct s s1 = { 0 };  //初始化为:0
	s1.a = 10;
	s1.b = 12;
	s1.c = 3;
	s1.d = 4;

	printf("%d\n", sizeof(struct s));   //3

	return 0;
}

上面的这个代码,虽然看似残缺,但是,笔者通过带领大家在调试中监视一下内存中的数据!可以看出来想要的内容!

代码的运行结果为:

 char 类型,1个字节,8个比特位!

首先:对于数据,在内存中的存储,都是以:二进制形式存储的!!

对于a = 10  ,a的二进制形式为:000000000000000000000000000001010;但是,由于:char a : 3;  //3指的是:a占3个比特位  ,所以,a的二进制位在存储的时候,发生截断!仅保留3个比特位010;    同理可得:b = 12;  仅保留4个比特位:1100,对于:   c = 3;  仅保留5个比特位:00011;    对于d = 4;仅保留4个比特位:0100


在代码的初始状态下:全部初始化为0:

此时:

 将a, b, c ,d 的内容放进去后的内容为::

 

 

在上面的结果中:比特位是从地位向高位(从左边向右边)使用的,当左边剩下的位数不够的时候,丢弃掉,再重新开辟一个字节(char类型),再在那个重新开辟的字节内部,从右边向左边使用!!


上面的代码,经过调试可见:笔者就不再带领大家进行VS的调试了!大家可以自行调试!!

另外,在内存中,调试后的结果会为: 62 03 04  原因是:在内存中的观看情况为:4个2进制位为一个16进制位!!

猜你喜欢

转载自blog.csdn.net/weixin_64308540/article/details/127280902
今日推荐