计算机中的数字往往大于一个字节,比如四个字节的int,这就会带来一个问题,如何储存这种多字节数据,以确保每个字节都有自己的地址。哪个字节应该被放在低位,哪个字节应该被放在高位。
没有“正确”的顺序来存储多字节数量的字节。硬件是为以特定顺序处理字节而构建的,只要兼容的硬件以相同的顺序读取字节,程序就没问题。我们将看两种主要类型的字节排序:小字节序和大字节序。
小字节序(little endian)
如果硬件会将多字节标量的最低有效字节存放在“第一位”(内存的最低位),那我们就说该硬件是“小字节序”。所以最小的那一端的数字会被先存到最低的内存地址去。
大字节序(big endian)
如果硬件会将多字节标量的最高有效字节存放在“第一位”(内存最低位),那我们就说该硬件是“大字节序”。最高有效位会被存到最低的内存地址。
例子:
假设我们现在有个四字节的整数0x44332211。 对于这个数字来说,最小端就是0x11,最大端就是0x44所以两种储存模式的地址如下。
如果我们memory dump(不知道怎么翻译了TAT)里的四位打印出来,我们知道,memory dump打印的时候,总是先打印地址低的,再打印地址高的。那么大字节序下储存的数字,就会像这样打印出来。
ADDRESS: ---------- MEMORY BYTES ---------- 100: 00 44 33 22 11 00 00 00 00 00 ...
这就是大字节序的一个很好的性质,它被打印出来时,我们看到顺序的和手写数字顺序一样。
反之,小字节序打印出来就是:
ADDRESS: ---------- MEMORY BYTES ---------- 100: 00 11 22 33 44 00 00 00 00 00 ...
这就与手写数字相反,很多时候需要反转输出。
对于字符数据来说,他们不会被大小字符存储方式影响,因为每个字符只占一个字节,所以都是从小到大储存的。