40

我想知道,为什么有些架构使用小端,而另一些架构使用大端。我记得我在某处读到它与性能有关,但是,我不明白字节序如何影响它。我也知道:

little-endian 系统的特性是可以从内存中读取不同长度的相同值,而无需使用不同的地址。

这似乎是一个不错的功能,但即便如此,许多系统使用大端,这可能意味着大端也有一些优势(如果是这样,哪个?)。

我敢肯定还有更多,最有可能深入到硬件级别。很想知道细节。

4

2 回答 2

41

我在网上浏览了一些关于这个问题的更多信息,并且有很多答案和推理来解释为什么大端或小端排序可能更可取。我会尽力在这里解释我的发现:

小端序

little-endianness 的明显优势是您在问题中已经提到的......事实上,给定的数字可以被读取为来自同一内存地址的不同数量的位。正如关于该主题的维基百科文章所述:

尽管高级程序员很少直接使用这种 little-endian 属性,但它经常被代码优化器和汇编语言程序员使用。

正因为如此,涉及多个精度的数学函数更容易编写,因为字节的重要性将始终对应于内存地址,而对于大端数字则不是这样。这似乎是一遍又一遍地引用的小端序的论点......由于它的普遍性,我不得不假设这种排序的好处是相对显着的。

我发现的另一个有趣的解释涉及加法和减法。在添加或减去多字节数时,必须首先获取最低有效字节,以查看是否存在对更高有效字节的结转。因为最低有效字节首先以 little-endian 数字读取,所以系统可以并行化并开始计算该字节,同时获取后续字节。

大端序

回到维基百科的文章,大端数字的优势在于可以更容易地估计数字的大小,因为最重要的数字在前。与这一事实相关的是,通过简单地检查最低字节中偏移量 0 处的位,很容易判断一个数字是正数还是负数。

在讨论大端序的好处时,还说明了二进制数字的顺序与大多数人订购 base-10 数字一样。当从二进制转换为十进制时,这在性能方面是有利的。


尽管所有这些论点都很有趣(至少我认为如此),但它们对现代处理器的适用性是另一回事。特别是,加法/减法参数在 8 位系统上最有效......

在我看来,小端序似乎是最有意义的,并且在查看所有使用它的设备时是迄今为止最常见的。我认为仍然使用大端序的原因更多是为了遗留而不是性能。也许有一次,给定架构的设计者认为大端比小端更可取,并且随着架构多年来的发展,端保持不变。

我在这里画的平行是JPEG(大端)。JPEG 是大端格式,尽管几乎所有使用它的机器都是小端格式。虽然有人可能会问 JPEG 作为大端序有什么好处,但我会大胆地说,就所有意图和目的而言,上述性能论点并没有产生任何影响。事实是 JPEG 就是这样设计的,只要它仍在使用,它就会一直保持这种状态。

于 2012-12-21T14:24:37.137 回答
1

我假设曾经是第一批处理器的硬件设计人员决定哪种字节序最适合与他们从头开发的芯片的首选/现有/计划微架构集成。

Once established, and for compatibility reasons, the endianness was more or less carried on to later generations of hardware; which would support the 'legacy' argument for why still both kinds exist today.

于 2012-12-25T23:31:19.010 回答