数据的存储和排列顺序

• 80年代开始,几乎所有通用计算机都采用字节编址 • 在高级语言中声明的基本数据类型有char、short、int、long、long long、float、double、long double等各种不同长度数据 • 一个基本数据可能会占用多个存储单元 – 例如,若int型变量x=-10, x的存放地址为100,其机器数为FFFFFFF6H,占4个单元 -10=-1010B [-10]补=FFFFFFF6H • 需要考虑以下问题: – 变量的地址是其最大地址还是最小地址? 最小地址,即x存放在100#~103#! – 多个字节在存储单元中存放的顺序如何? 大端方式/小端方式 [

](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050523-300x198.png)
](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050523-300x198.png)

检测系统的字节顺序

• union的存放顺序是所有成员从低地址开始,利用该特性可测试CPU的大/小端方式。 [

](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050524-300x143.jpg)
](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050524-300x143.jpg)

大端/小端方式举例

假定小端方式机器中某条指令的地址为1000 该指令的汇编形式为:mov AX, 0x12345(BX) 其中操作码mov为40H,寄存器AX和BX的编号分别为0001B和0010B,立即数占32位,则存放顺序为: • 以下是一个由反汇编器生成的一行针对IA-32处理器的机器级代码表示文本: 80483d2: 89 85 a0 fe ff ff mov %eax, 0xfffffea0(%ebp) 其中,80483d2是十六进制表示的指令地址 89 85 a0 fe ff ff 是机器指令 mov %eax, 0xfffffea0(%ebp) 是对应的汇编指令 0xfffffea0是立即数 请问:立即数0xfffffea0的值和所存放地址分别是多少?IA-32是大端还是小端方式? 立即数0xfffffea0所存放的地址为0x80483d4; 立即数0xfffffea0的值为-10110000B=-176; IA-32采用的是小端方式!

字节交换问题

[

](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050526-300x190.png)
](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050526-300x190.png)

视频链接:

计算机系统基础(一):程序的表示,转换与链接

计算机系统基础(二):程序的执行和存储访问

计算机系统基础(三):异常、中断和输入/输出