🏷️ 知识点:数据对齐
在按字节编址,采用小端方式的32位计算机中,按边界对齐方式为以下 C 语言结构型变量 a 分配存储空间。
struct record {
short x1;
int x2;
} a;
若 a 的首地址为 2020FE00H,a 的成员变量 x2 的机器数为 12340000H,则其中 34H 所在存储单元的地址是( )。
A. 2020FE04H B. 2020FE07H C. 2020FE05H D. 2020FE06H
[tag_link]
正确答案:C
在 32 位计算机中,按字节编址,根据 小端序 和按 边界对齐 的定义,给出变量 a 的存放方式如下:
某计算机存储器按字节编址,采用小端方式存放数据。假定编译器规定int 型和short 型长度分别为32 位和16位,并且数据按边界对齐存储。某C 语言程序段如下:
struct {
int a;
char b; short c;
}record;
record\.a= 273;
若record 变量的首地址为0xC008, 则地址0xC008中内容及record.c 的地址分别为()。
A.0x00 、0xC00D
B.0x00 、0xC00E
C.0x11 、0xC00D
D.0x11 、0xC00E
[tag_link]
正确答案:D
尽管 record 大小为 7 个字节(成员 a 有 4 个字节,成员 b 有 1 个字节,成员 c 有 2 个字节), 由于数据按边界对齐方式存储,故 record 共占用 8 个字节。record.a 的十六进制 表示为 0x00000111,由于采用小端方式存放数据,故地址 0xC008 中内容应为低字节 0x11; record.b 只占 1 个字节,后面的一个字节留空;record.c 占 2 个字节,故其地址为 0xC00E。各字 节的存储分配如下图所示。地址 0xC008 0xC009 0xC00A 0xC00B 内容 record.a.(0x11) record.a.(0x01) record.a.(0x00) record.a.(0x00) 地址 0xC00C 0xC00D 0xC00E 0xC00F 内容 record.b - record.c record.c
某32计算机按字节编址,采用小端方式存放数据,编译器按边界对齐方式为下列 C 语言结构型数组 变量 employee 分配储存空间。
struct record{
int id;
char name[10];
int salary;
}employee[ 200];
数组 employee 的起始地址为0000A0BOH,employee[1].id 的机器数为12345678H, 问 5 6H 的地址是多 少 ? ( ) 。
A.0000 A0C3H
B.0000 A0C4H
C.0000 A0C5H
D.0000A0C6H
[tag_link]
正确答案:C
在 小端方式 下,数据的存放顺序是从最低有效字节到最高有效字节。例如,对于一个 4 字节的整数 12345678H,存放顺序为 78H 56H 34H 12H。首先,我们需要计算 struct record 的大小。根据定义: int id ; 占用 4 字节。char name[10] ; 占用 10 字节。int salary ; 占用 4 字节。总共需要 18 字节。然而,由于编译器按 边界对齐 方式分配存储空间,通常会对齐到最接近的 4 字节边界。因此,struct record 实际上会占用 20 字节(因为 18 需要向上对齐到 20)。数组 employee 的起始地址为 0000A0B0H。employee[1] 的起始地址为 0000A0B0H + 20 = 0000A0C4H 在 employee[1] 中, id 的值为 12345678H,存储在小端模式下: 地址 0000A0C4H ��放 78H 地址 0000A0C5H 存放 56H 地址 0000A0C6H 存放 34H 地址 0000A0C7H 存放 12H 因此,56H 的地址是 0000A0C5H。