Appearance
题目
某计算机字长为 32 位,按字节编址,采用小端 (Little Endian) 方式存放数据,假定有一个 double 型变量,其机器数表示为 1122 3344 5566 7788H 存放在 0000 8040H 开始的连续存储单元中,则存储单元 0000 8046H 中存放的是( )。
错因
B
字节偏移算成了 5(应是 6),又把字节顺序方向想对了一半。0x8046 - 0x8040 = 6,不是 5;如果按 5 来定位会落到第 5 字节 33H,刚好命中 B。建议每次都把"基地址 + 偏移 = 当前地址"在草稿上写清楚,别心算偏移。
C
把"小端"理解反了——以为最低地址放最高字节(实际是大端的规则)。按大端推:0x8040 放 11H、0x8041 放 22H、…… 0x8046 放 66H,结果就掉进 C。记忆法:小端 = "低地址存低字节";大端 = "低地址存高字节"。
D
字节顺序方向用反(同 C 的大端理解),偏移又错位 1。两步同时出错才能落到 77H。建议把 8 个字节按地址从小到大列成表,再读对应行——别在头脑里直接定位。
总解析
第一步:明确 double 占 8 字节,覆盖地址范围
double 数据 0x1122_3344_5566_7788 共 8 字节,从 0x0000_8040 起连续存放,覆盖地址 0x8040 ~ 0x8047。
第二步:列出小端字节排列表
小端规则:最低地址存最低字节。把机器数按字节从低到高拆开(最右两位是最低字节):
| 字节序号 | 该字节值 |
|---|---|
| 最低字节 B0 | 88H |
| B1 | 77H |
| B2 | 66H |
| B3 | 55H |
| B4 | 44H |
| B5 | 33H |
| B6 | 22H |
| 最高字节 B7 | 11H |
按小端写入内存:
| 地址 | 0x8040 | 0x8041 | 0x8042 | 0x8043 | 0x8044 | 0x8045 | 0x8046 | 0x8047 |
|---|---|---|---|---|---|---|---|---|
| 字节 | 88H | 77H | 66H | 55H | 44H | 33H | 22H | 11H |
第三步:定位查询地址
0x8046 - 0x8040 = 6 → 第 6 字节(从 0 计数),值为 22H。
最终答案是 A(22H)。
易混淆速记:
- 小端:"Little-endian = 低地址放 LSB(最低字节)"——首字母 L 对 L
- 大端:"Big-endian = 低地址放 Biggest(最高字节)"——首字母 B 对 B
- 内存视图按地址从小到大读:小端 = 数据"反着读";大端 = 数据"正着读"