Appearance
题目
按字节编址的计算机中,某 double 型数组 A 的首地址为 2000H,使用变址寻址和循环结构访问数组 A,保存数组下标的变址寄存器初值为 0,每次循环取一个数组元素,其偏移地址为变址值乘以 sizeof(double),取完后变址寄存器内容自动加 1。若某次循环所取元素的地址为 2100H,则进入该次循环时变址寄存器的内容是( )。
错因
A
把"偏移 / 元素大小"算成了"偏移 / 4"——也许把 double 当成了 4 字节(混淆了 float 和 double 的大小)。0x100 = 256,256 / 4 = 64;可能 25 是把 0x100 直接读成十进制 100 后再 / 4 得到,即 100/4 = 25——把十六进制当十进制读 + 元素大小记错,两个错叠加。
C
漏掉了"乘以 sizeof(double)"那一步——直接把偏移当变址值。,所以"看似下标 = 256"。但题面明说"偏移 = 变址 × 8",反过来推:变址 = 偏移 ÷ 8 = 256 / 8 = 32,不是 64。256 是把变址当 4 字节而非 8 字节得到的(256/4=64)。
D
把 0x100 直接当成十进制 100。0x100 实际上 = ,差了 156。看到十六进制三位 100 别想当然——H 后缀明示是 16 进制。
总解析
第一步:明确变址 → 地址的换算关系
题面给定:
- 首地址 = 0x2000
- sizeof(double) = 8 字节(按字节编址 + double 标准大小)
- 当前元素地址 = 0x2100
第二步:算偏移
第三步:反解变址值
最终答案是 B(32)。
逐次循环对照表(验证):
| 变址值 | 元素地址 = 0x2000 + 变址 × 8 |
|---|---|
| 0 | 0x2000 |
| 1 | 0x2008 |
| 2 | 0x2010 |
| ... | ... |
| 31 | 0x20F8 |
| 32 | 0x2100 ← 命中 |
| 33 | 0x2108 |
易错点速查:
- 0x100 ≠ 100——十六进制 0x100 = 256;养成习惯:地址带 H 后缀必须按 16 进制展开
- double = 8 字节,不是 4 字节(4 字节是 float)
- 偏移和变址的换算:变址 = 偏移 ÷ 元素大小(不是 ÷ 4 也不是直接等于偏移)
衍生:常见类型的字节大小(C 语言):
| 类型 | 字节数 |
|---|---|
| char | 1 |
| short | 2 |
| int / float | 4 |
| double | 8 |
| long long | 8 |