0x7788在内存中的存储关系

#include <stdio.h> int main(void) { union { char a[2]; int b; } s; s.b = 0x7788; printf("%x", s.a[1]); return 0; }

代码分析:这段C代码定义了一个联合体s,包含一个2字节的字符数组a[2]和一个整数b(假设为2字节)。整数0x7788被赋值给s.b。由于联合体共享内存,s.a[0]s.a[1]分别对应s.b的低字节和高字节。

内存存储可视化

地址
s.a[0] (低地址)
0x88
低字节
s.a[1] (高地址)
0x77
高字节
说明
s.b 的低字节 (0x88)
s.b 的高字节 (0x77)
↓ 小端序存储:低字节在前,高字节在后

为什么输出77?

小端序系统(大多数x86/x64系统)

在小端序系统中,数据的低字节存储在低内存地址,高字节存储在高内存地址。

对于值0x7788

  • 0x88是低字节,存储在s.a[0]
  • 0x77是高字节,存储在s.a[1]

printf("%x", s.a[1]);输出s.a[1]的值,即0x77

大端序系统(网络字节序,某些ARM/RISC系统)

在大端序系统中,数据的高字节存储在低内存地址,低字节存储在高内存地址。

对于值0x7788

  • 0x77是高字节,会存储在s.a[0]
  • 0x88是低字节,会存储在s.a[1]

如果系统是大端序,printf("%x", s.a[1]);会输出0x88

注意:示例中假设整数b为2字节。在实际的32位或64位系统中,int通常是4字节。如果是4字节整数,0x7788在内存中会被扩展为0x00007788,存储方式类似。

结论

在小端序系统中,0x7788在内存中被存储为0x88(低地址)和0x77(高地址)。

代码s.a[1]访问的是联合体的第二个字节(高地址),其值为0x77,因此printf输出77