注:
在存储器中,左边的字节地址单元低于右边的字节地址单元,字节地址单元一般由八位二进制组成(即两位16进制数表示);而在数据的表示中,左边的字节高于右边的字节(数据的字节可以理解为数据转成16进制后,从右往左每相邻两位的一个组合,前面位数不够就补0)
实战例题:
某计算机存储器按字节编址,采用小端方式存放数据。假定编译器规定int 型、float型和 short型长度分别为32位、32 位和16 位,并且数据按边界对齐存储。某C 语言程序段如下:
struct{
float a;
char b;
short c;
short d;
float e;
int f;
char g[6];
} record;
record.d= -0xCDAB;
record.e= 20.59375f;
若record变量的首地址为0xFF24,则
(1)地址0xFF2D中内容为0x___。(填十六进制数)
(2)地址0xFF33 中内容为0x___。(填十六进制数)
(3)浮点型record.e是按 IEEE754 标准编码后存放。
(4)record.g[5]的地址为0x___。(填十六进制数)
(5)结构体record一共占___个字节的大小。(填十进制数)
注意:填写答案时,如须填写英文字母一律使用大写。
-
Step1:
先按照边界对齐存储方式将所需的内存空间进行分配,如图所示:(需要熟悉基本数据类型所占字节,一个小格子代表一个字节)
-
Step2:
找到要求数据所对应的地址位置
-
Step3:
将该区域的数据采用小端存储(要先将该数据转换成补码,按16进制来存),然后观察该地址单元所对应的数据字节
例如:
- 0xFF2D地址所在区域是 short d 的存储位置,d= -0xCDAB 为整型真值,转成补码 [d]补:3255H 按小端方式存入,顺序为:5532;所以0xFF2D所存内容为:0x32
- 同理可知0xFF33地址所在区域是 float e 的存储位置,将e=20.59375 为浮点数真值,通过IEEE754规范转换成16进制数为:41A4C000 按小端方式存入,顺序为:00C0A441;所以0xFF33所存内容为:0x41
-
Step4:
要确定record.g[5]的地址,只需要一个格子一个格子的数出来即可,易知它的地址为:0xFF3D
-
Step5:
计算出所用的单元格,(空值也需要计算,计算机是四个四个字节的读取,所以最后的两个空值也是需要计算)易知该record结构体所占字节为:28
由上面的做题我们也可以得出一个结论:
在C语言中结构体所占字节一定是4的倍数,同时结构体存储数据是按顺序存储的