有两种常用于多字节数据的组织,例如big-endian和little-endian。在 big-endian 格式中,值的最重要字节保存在位置 X 中,随后的字节保存在位置 X + 1 中,依此类推。例如,将存储十六进制值 0102 0304H(H 表示十六进制),从位置 100H 开始,如表 (a) 所示。
(a) 大端和 (b) 小端格式的数据组织
内存地址 | 数据(十六进制) |
---|---|
101 | 01 |
102 | 02 |
103 | 03 |
104 | 04 |
(一种)
内存地址 | 数据(十六进制) |
---|---|
101 | 04 |
102 | 03 |
103 | 02 |
104 | 01 |
(二)
在小端,顺序是相反的。最小有效字节保存在位置 X,下一个字节保存在位置 X+1 中,依此类推。表 (b) 中显示的类似小端格式的值。
相同的组织可用于字节内的位。在 big-endian 组织中,bit 0 是一个字节的最右边的 bit,最左边的 bit 是 bit 7。在 little-endian 组织中,最左边的 bit 是 bit 0,bit 7 是右边——最一点。
Endian 组织用于字节和字不会影响 CPU 和计算机系统的性能。只要 CPU 被设计为处理特定格式,两者都不比另一个好。主要问题在于在具有不同字节序的计算机之间传输数据。例如,如果小端组织的计算机将值 01020304H 传输到大端组织的计算机,而未转换数据,则大端组织的计算机将读取值为 04030201H。
某些程序可以将数据文件从一种格式转换为另一种格式,而某些微处理器具有执行转换的特殊指令。多字节字还有另一个需要关注的问题是对齐。现代微处理器一次可以读取多个字节的数据。例如,Motorola 68040 微处理器可以同时读取四个字节。
但是,除了两个最低有效位之外,四个字节必须位于具有相同地址的连续位置。该 CPU 可以同时读取位置 100、101、102 和 103,但不能同时读取位置 101、102、103 和 104。这种情况需要两次读取操作,一次用于位置 100(不需要)、101、102 和 103,另一次104、105(不需要)、106(不需要)和 107(不需要)。
对齐只是意味着将多字节值存储在位置中,以便它们从也开始多字节读取块的位置开始。在此示例中,这意味着在地址可被 4 整除的内存位置处开始多字节值,从而保证单次读取操作可以访问四字节值。