大端小端存储方式详解

  • 大端方式:用存储器的低字节地址单元来存放数据的最高字节

  • 小端存放:用存储器的低字节地址单元来存放数据的最低字节

注:
在存储器中,左边的字节地址单元低于右边的字节地址单元,字节地址单元一般由八位二进制组成(即两位16进制数表示);而在数据的表示中,左边的字节高于右边的字节(数据的字节可以理解为数据转成16进制后,从右往左每相邻两位的一个组合,前面位数不够就补0)
大端小端存储方式详解_第1张图片

实战例题:

某计算机存储器按字节编址,采用小端方式存放数据。假定编译器规定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:

    先按照边界对齐存储方式将所需的内存空间进行分配,如图所示:(需要熟悉基本数据类型所占字节,一个小格子代表一个字节)

    大端小端存储方式详解_第2张图片

  • Step2:

    找到要求数据所对应的地址位置

    大端小端存储方式详解_第3张图片

  • 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的倍数,同时结构体存储数据是按顺序存储的

你可能感兴趣的:(Course,of,Study,经验分享)