C语言结构体位域,一次讲清楚
时间:2023-08-20 14:26:32来源:哔哩哔哩

平台为32位的kali以及windows11 64位

编译器为gcc (Debian ) 以及 mingw gcc


(资料图)

注意:1,本文补零只是一个说法,大致意思就是填充,至于填充什么,我暂时以零算,所以叫补零

2,本文只是我个人探究得出结论,总体基本上都是在平台上测试过,如有不对的地方,还望大家指正,在这里叩谢了。

本文最佳阅读我个人觉得,可用先‘简单’阅读一下内容直到介绍4位与8位补齐,认真看一下位对齐策略4位8位补齐以及极限算法,然后再回过头重新看一遍,基本上就完事了。

下面开始!

核心:探究得出位域规律核心内容如下

整体趋向于最大的位数对齐(结构中位最大的类型)确定结构的对齐字节

“位域无法跨越字节”  当前类型位域能放下的放在一起 不能放下的 剩余字节位域补零 补零后在下一字节开始 存入下一成员 已存放类型位置不变

两参数临近存放 如果位域超过了前一个成员类型位域大小 先填入前面参数 字节的剩余位域补零 下一字节存放第二个成员 

到这里,没事,不要紧,你看不明白很正常,我总结的都费劲嫌自己啰嗦,更别说你只是看了,接下来才是重点,上面只是留个映像。

”重要!!!“总之记住下面这三点 括号内的看一眼有点映像就好了

1, 先找出位域最大的类型 这个结构体自能是该类型的倍数大小(包括一倍)

2,搞清楚位和字节的区别 当前平台下1字节等于8位 有8位补齐策略(还有4位补齐和极限算法,8位补齐意思就是不足八个,将8位中剩余几个补零,需要存的数据必须再八位以后存放  4位补齐就是不足4位的 把4位剩余几个补零,需要存的数据可再4位后存放)

3,“从前向后” 类型相同能挤就挤 

下面是例子:

1,能挤就挤

struct{

char a:3;

char b:4;

}   3+4<8 能挤下 就占一个字节,也就是8位

2,不能挤就当前类型字节补零 重开字节存储

struct{

char a:3;

char b:6;

}   3+6>8 不能挤 第一个参数存入 剩余字节位域补零 在当前类型下一个字节存放 

3,不相同就按最大的 但类型最大位域还是要遵守 

struct{

char a:3;

short b:4;

}   3+4<8 能挤下 就占一个字节 但结构必须是最大位域类型的倍数 不足的需要补零 所以当前就占两个字节(short是2个字节)除了放置数据的 其他位置全补零

4,不能挤下还有类型差

struct{

char a:3;

short b:6;

}   3+6>8 不能挤 第一个参数存入 剩余字节位域补零 在当前类型下一个字节存放 存放完补零 补完再补整体最大类型位域的空位 当前结构最大类型是short 就等于两个数据加起来位域必须得是short的位域倍数 不足的补零 a占一个字节 b占一个字节 刚好满足short位域倍数(1倍:16位)

5,不能挤

struct{

char a:3;

short b:12;

}   3+12>8 不能挤 第一个参数存入 剩余字节位域补零 在当前类型下一个字节存放 但b有12位 一个字节存不下 所以就提升到当前类型字节(char->short  8位变成16位) 存放完补零 补完再补整体最大类型位域的空位 当前结构最大类型是int 就等于两个数据加起来位域必须得是int的位域倍数 不足的补零 a占一个字节 b占一个字节 刚好满足short位域倍数(1倍:16位)

6,不能挤

struct{

char a:3;

short b:14;

}   3+14>8 不能挤 第一个参数存入 剩余字节位域补零 在当前类型下一个字节存放 但b有14位 一个字节存不下 所以就提升到当前类型字节(char->short  8位变成16位) 存放完补零 补完再补整体最大类型位域的空位 当前结构最大类型是short 就等于两个数据加起来位域必须得是short的位域倍数 不足的补零 a占一个字节 b占2个字节 整体补零一个字节 刚好满足2个short位域倍数(2倍:32位)

7,不能挤

struct{

char a:3;

int b:30;

}   再介绍一下这种情况 明显ab位域char的位域满足不了 所以a补齐8位 然后填入b的内容 b再补齐自己类型位域 最后执行整体位域补齐,当前整体位域开篇就说过,这里是int的倍数 而当前一个int位域肯定放不下 所以就两个 多的空域补零

8,不能挤

struct{

char a:3;

int b:30;

char c:3;

}   这个结构再我的环境下占12字节 为什么? 因为前面两个的两个int位根据开篇说的从前向后规则已经是定了的,而且b和c凑一起是大于int位域位数 所以挤不了 只能再开一片空间存储 这时候结构要执行整体位域补齐 所以c后面将整体补零满足要求 大致就是c占3位 填补5位 b占30位 填补2位 填补24位 c占3位 填补5位 填补24位 整体填补0位 最终占96位 12字节

9,后面可用挤

struct{

char a:3;

int b:30;

char c:2;

}   这种你以为还是和上面一样吗 不 这个的b和c刚好能执行极限算法 下面有介绍极限算法  a占3位 补5位 b占30位 c占2位 补0位 整体补24位  最终占64位 8字节

小重点啦!!!位对齐策略解释一下4位补齐与8位补齐策略区别

struct{

char a:3;

short b:6;

8位中 a+b>8 不能一起存放 a后面的位域要补零 补足8位 二进制也就是a**00000 b******00

4位中 a+b>8 不能一起存放 a后面的位域要补零 补足4位 二进制也就是a**0 b** ***0000000

问有什么作用?来看

struct{

char a:3;

short b:12;

8位中 a+b>8 不能一起存放 a后面的位域要补零 补足8位 也就是a**00000 b******* ****0000 00000000  最终4字节 说明一下 这是两个short 不是提升到int了 开篇就说过 ,只能是最大类型的倍数 这种情况就是两个short位域大小  其中第21到24是short补齐 25到32 是整体补齐,满足最大类型倍数的要求

4位中 a+b>8 不能一起存放 a后面的位域要补零 补足4位 也就是a**0b*** ********最终2字节

大重点!!!最后再说一下一种极限算法 如今很多都是以这种为主 4位8位补齐是备选

struct{

char a:3;

short b:13;

}

极限算法:a**b**** ********  只要填不满 我就不添加类型位域空间 最终2字节

struct{

char a:3;

short b:14;

}

这种情况极限算法也没招 就看第二支持的是8位还是4位对齐了 

8位a**00000 b******* ******00 00000000

4位a**0b*** ******** **000000 00000000

现在你明白了吗?

还不明白 去看一下开篇的中心内容 三点要记下的东西 再看一下位对齐策略 最后去看一下例子

再不明白,集齐万赞或千币我出视频好吧。

辛苦了您,感谢阅读。

标签:

最新
  • C语言结构体位域,一次讲清楚

    平台为32位的kali以及windows1164位编译器为gcc(Debian13 1 0-6)13 1 0

  • 出料加工贸易快速增长 专家:未来仍有较大发展空间

    近日,海关总署发布数据显示,今年1-7月,我国出料加工贸易进出口值为3

  • 一朵开三天,一天一变色!太原迎泽公园,王莲盛开!快来打卡

    一叶当舟,凌波驭浪!近日,迎泽公园泽众书院龙池内数株王莲相继开花,

  • 政策信号释放,逆周期调节将加力

    《中国证券报》19日刊发文章《政策信号释放逆周期调节将加力》。文章称

  • 中庚基金丘栋荣旗下中庚品质中报最新持仓,重仓中国宏桥

    8月18日中庚基金旗下丘栋荣管理的中庚价值品质一年持有期混合型基金公

  • 第7届南博会—2023智慧交通与智能汽车(昆明)国际论坛举行

    昆明信息港讯(昆明日报记者李双双 首席记者贾献培)8月18日,以“交

  • 百川能源:融资净偿还444.84万元,融资余额3924.17万元(08-18)

    2023年8月18日百川能源融资净偿还444 84万元,融资余额3924 17万元

  • 天山股份于苏州投资设立材料新公司

    【天山股份于苏州投资设立材料新公司】企查查APP显示,近日,苏州开源

  • 沙特王储兼首相会见伊朗外长

    据沙特媒体当地时间18日报道,沙特王储兼首相穆罕默德会见了到访的伊朗

  • 非婚生育不给抚养费有什么办法

    1、我国法律规定,离婚的父母对未成年子女仍然有抚养的义务,如果有一

  • 科隆展开幕之夜有望公布《死亡搁浅2》新预告

    《死亡搁浅2》新预告片有望出现在德国科隆展开幕之夜直播活动上。近日

  • 曝哈登被认为本将在今夏跳出选项 和76人顶薪续约

    北京时间8月17日,据记者EricPincus报道,多位消息人士透露,无论达雷

  • 弹丸论破ed(关于弹丸论破ed的基本详情介绍)

    弹丸论破ed,丸论破ed的基本详情介绍很多人还不知道,那么现在让我们一

  • 夏威夷火灾已致106人死亡 第一批遇难者身份确认

    夏威夷火灾已致106人死亡第一批遇难者身份确认

  • 7家再保险运营中心获批,上海再保险国际板迈出实质步伐

    7家再保险运营中心获批,上海再保险国际板迈出实质步伐,运营,财险,金融

  • 新华社纪录片|生态贵州

    石漠化严重的小山村资源枯竭的矿区工业密集的城市……面对生态环境疑难

  • 旅游
    • 百度智能云“千帆大模型平台”升级

    • 八月相约济宁 | 中国国家话剧院青年导演剧目及邀请剧目开票

    • 2023西部文化旅游融合发展暨旅游商品交易会在新区举行

    • “强国复兴有我”主题志愿服务活动走进环翠