C++中Union与小端序问题:short成员输出为何不符合预期?
小端序下Union成员读取的逻辑解析
先明确小端序的核心:低字节数据存在内存低地址,高字节数据存在内存高地址,而不同类型读取内存时,会按照自身的字节序规则解析数据。
你的Union在小端序处理器上的内存布局(假设int占4字节、short占2字节、char占1字节,地址从左到右递增):
| 内存地址(低→高) | 存储字节 | 对应成员关联 |
|---|---|---|
| 0x00 | 0x78 | obj.ch、obj.b的低字节 |
| 0x01 | 0x56 | obj.b的高字节 |
| 0x02 | 0x34 | obj.a的次高字节 |
| 0x03 | 0x12 | obj.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
相关产品推荐
相关产品推荐

