对于位段,笔者在上篇文章中,已经详细的讲解了:位段的基础知识!!下面笔者来带领大家,学习一下:位段的内存分配!请大家紧跟步伐!!
在此之前,还需要各位老铁知道一下基础知识:
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进制位!!