ToB企服应用市场:ToB评测及商务社交产业平台

标题: 位段 -- 内存结构详解C语言 [打印本页]

作者: 美丽的神话    时间: 2024-8-4 15:21
标题: 位段 -- 内存结构详解C语言
目录

位段

位段的介绍

位段(二进制位):就是按位存储
位段(bit-field)是C语言中的一种特殊数据类型,它允许将一个字节分成几个部分,并为每个部分指定特定的位数,以便在内存中存储和访问这些部分。
其中位段相较于结构体有两特殊点
位段使用示例:
  1. struct S
  2. {
  3.     int a : 2;  //限定2个比特位
  4.     int b : 5;  //限定5个比特位
  5.     int c : 10; //限定10个比特位
  6.     int d : 30; //限定30个比特位
  7. };
复制代码
位段的内存分配

1.位段的空间上是按照需要以4个字节(int)大概1个字节(char)的方式来开辟的。(...如,int一次开辟4字节32比特位来使用,不够再开辟)
2.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。(网络编程涉及,网络传输数据包,)
(缘故起因:没有C语言尺度,各编译器有所不同。)
位段不能大于32(32位呆板),16位则不能大于16位
不给定位段的默以为字节数
Example
  1. struct S
  2. {
  3.     char a : 3;
  4.     char b : 4;
  5.     char c : 5;
  6.     char d : 4;
  7. };
  8. int main()
  9. {
  10.     struct S s = { 0 };
  11.     s.a = 10;// 1010 |  010
  12.     s.b = 20;//10100 | 0100
  13.     s.c = 3; //  011 |00011
  14.     s.d = 4; //  100 | 0100
  15.     return 0;
  16. }
复制代码
内存分配解析:
  1. 1. VS编译器为从左往右一次申请空间,一次1个字节/8个比特位
  2. -----> 申请空间方向 ---->
  3.   0000 0000
  4. 2. 然后开始存放a的数据10(D) = 1010(B),a限制为3个比特,多出的比特会被丢弃,即最后保留数据为010(B),
  5. --- vs中,每个字节内数据从右往左写入;
  6. (地址)  0000 0|010
  7. 3. 放好a后,开始放b = 20(D) = 10100(B),b限制为4字节,切割b,得到b = 0100(B)
  8. 第一空间放完a后,还剩5个比特,组以容纳b,因此在从四个字节开始(从右往左数),写入b
  9. (地址)  0010 0010(b)                                                                 = 22(h);
  10. (划分)        0 | 0 1 0 0 | 0 1 0   
  11.                                                    b        a
  12. 4. 接下来放c,c占5个比特位,显然第一个字节不够放了,因此要开辟第二个字节,然后切割c(不超过因此不用切),得到c = 011(b) ;
  13. (地址)  0010 0010                0000 0011
  14. (划分)  0 | 0 1 0 0 | 0 1 0     0 0 0 | 0 0 0 1 1   
  15.                          舍     b         a                  c
  16. 5.接下来放d,d占4个字节,显然第2个字节不够放了,因此申请第三个字节,然后切割b,得到100(b);
  17. (地址)  0010 0010                0000 0011         0000 0100
  18. (划分)        0 | 0 1 0 0 | 0 1 0     0 0 0 | 0 0 0 1 1     0 0 0 0 | 0 1 0 0
  19.                           舍     b        a         舍        c                      d
  20. 6.最后转换十六进制,得到
  21.     22                                           03                                                04   (十六进制)
  22. 即内存显示:22 03 04
  23. 7.还可能会有内存对齐,32位为 22 03 04 00 ....
复制代码

位段的跨平台标题

跟结构体相比,位段可以达到同样的结果,但是可以很好的节流空间,但是有跨平台的标题存在。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4