You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中Union与小端序问题:short成员输出为何不符合预期?

小端序下Union成员读取的逻辑解析

先明确小端序的核心:低字节数据存在内存低地址,高字节数据存在内存高地址,而不同类型读取内存时,会按照自身的字节序规则解析数据。

你的Union在小端序处理器上的内存布局(假设int占4字节、short占2字节、char占1字节,地址从左到右递增):

内存地址(低→高)存储字节对应成员关联
0x000x78obj.ch、obj.b的低字节
0x010x56obj.b的高字节
0x020x34obj.a的次高字节
0x030x12obj.a的最高字节

当读取obj.b(short类型)时,小端序的解析规则是:把内存低地址的字节作为该类型的低8位,内存高地址的字节作为高8位,组合成最终数值:

  • 低8位:0x78,高8位:0x56
  • 计算得:0x56 << 8 | 0x78 = 0x5678,这就是你看到的输出结果。

你之前预期的0x7856,是误将内存的字节存储顺序直接等同于数值的十六进制拼接顺序,但实际上小端序的“反转”是针对存储环节,读取时类型会按自身规则还原数值:

  • 存储int 0x12345678时,字节按78 56 34 12(低→高地址)存放
  • 读取short时,取前两个字节78 56,但short会把第一个字节(78)当低位,第二个(56)当高位,所以组合出0x5678,而非直接拼接成7856。

举个反例:如果是大端序处理器,内存字节会按12 34 56 78存放,读取short时会得到0x1234,这也符合大端序“高字节存低地址,读取时直接按内存顺序组合”的规则。

你的代码行为完全符合小端序的定义,问题出在对short类型在小端序下的解析逻辑理解偏差。

内容的提问来源于stack exchange,提问作者Math Student

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:40:28