Skip to content

数据对齐与大小端

考情分析

大小端和数据对齐在 408 中属于中频考点,通常以选择题出现。典型题型:给定多字节数据和起始地址,画出大端/小端的存储布局;给定结构体成员,计算对齐后的总大小和各成员偏移量。

字节序(Byte Order)

一个多字节数据(如 32 位整数 0x12345678)在内存中按字节存放时,高字节和低字节的排列顺序有两种约定。

大端(Big Endian)

高位字节存放在低地址,与人类阅读顺序一致。

地址0x1000x1010x1020x103
数据12345678

网络协议(TCP/IP)统一使用大端,因此也叫网络字节序

代表架构:IBM z/Series、SPARC、PowerPC。

小端(Little Endian)

低位字节存放在低地址

地址0x1000x1010x1020x103
数据78563412

小端的优势:取低字节时地址不随数据宽度变化,方便硬件做变宽度访问(如从同一地址读 1 字节或 4 字节,最低字节地址相同)。

代表架构:x86/x64、ARM(默认小端)。

对比与记忆

特性大端小端
低地址存放最高有效字节(MSB)最低有效字节(LSB)
人类可读性自然反直觉
网络传输标准字节序需转换
硬件取低字节地址随宽度变化地址固定

口诀:大端 = 高字节在低地址(高低),小端 = 低字节在低地址(低低)。

判断字节序(编程方法)

c
int x = 1;
if (*(char *)&x == 1) {
    // 低地址存的是 1(低字节),小端
} else {
    // 低地址存的是 0(高字节),大端
}

数据的边界对齐

为什么对齐

CPU 按字(4 字节)或双字(8 字节)访问内存。如果一个 4 字节 int 跨越了两个对齐边界,处理器需要两次内存访问再拼接。

对齐规则

k 字节的数据类型存储在 k 的整数倍地址上:

数据类型大小对齐边界
char1B任意地址
short2B2 的倍数
int / float4B4 的倍数
double8B8 的倍数

结构体对齐

结构体的每个成员按自身对齐要求排列,成员之间可能插入填充字节(padding)。整个结构体的总大小是最大对齐值的整数倍。

c
struct S {
    char  a;    // 1B, 偏移 0
    int   b;    // 4B, 对齐到 4 → 偏移 4(填充 3 字节)
    short c;    // 2B, 偏移 8
};
// 总大小:最大对齐 4,8+2=10 → 补齐到 12

内存布局:

偏移01234567891011
内容apadpadpadbbbbccpadpad

调整成员顺序可以减少填充:

c
struct S2 {
    int   b;    // 偏移 0
    short c;    // 偏移 4
    char  a;    // 偏移 6
};
// 总大小:6+1=7 → 补齐到 8

节省了 4 字节,仅靠重新排列成员顺序。

未对齐访问的后果

不同架构对未对齐访问的处理不同:

架构处理方式
x86允许但有性能惩罚(自动拆分为多次访问)
ARM(严格模式)产生对齐异常
MIPS必须对齐,否则异常

例题

例 1:32 位整数 0xAABBCCDD 存储在地址 0x1000 处,分别写出大端和小端的存储内容。

大端:

0x10000x10010x10020x1003
AABBCCDD

小端:

0x10000x10010x10020x1003
DDCCBBAA

例 2:小端机器中,short x = 0x0102 存放在地址 0x2000,从 0x2000 读一个字节得到什么?

小端存储:0x2000 放低字节 020x2001 放高字节 01

0x2000 的一个字节,得到 0x02

例 3:计算以下结构体的大小(假设 double 按 8 字节对齐)。

c
struct T {
    char  a;    // 1B, 偏移 0
    double b;   // 8B, 对齐到 8 → 偏移 8(填充 7 字节)
    int   c;    // 4B, 偏移 16
    char  d;    // 1B, 偏移 20
};
// 最大对齐 8, 总大小 20+1=21 → 补齐到 24

答:24 字节。若把成员重排为 double b; int c; char a; char d;,总大小仅 16 字节。

考点清单

  • [ ] 大端:高字节在低地址(网络字节序)
  • [ ] 小端:低字节在低地址(x86 采用)
  • [ ] k 字节数据对齐到 k 的整数倍地址
  • [ ] 结构体总大小是最大对齐值的整数倍
  • [ ] 成员之间可能有填充字节,调整顺序可减少浪费
  • [ ] 未对齐访问:x86 允许但慢,ARM/MIPS 可能异常

真题练习

相关真题(6题)

2025Q15选择题2分

结构体数组内存布局与数据对齐

2020Q14选择题2分

结构体内存对齐与小端存储地址计算

2019Q15选择题2分

基址寻址与大端存储下的地址计算

2018Q15选择题2分

小端存储方式下负数的机器代码

2016Q14选择题2分

小端存储方式下double型数据的字节排列

2012Q15选择题2分

结构体在小端存储下的内存布局与对齐