所以,我想知道为什么有些架构使用little-endian和其他big-endian。我记得我在某处看过它与性能有关,但是,我不明白字节序会如何影响它。我也知道:
The little-endian system has the property that the same value can be read from memory at different lengths without using different addresses.
这似乎是一个很好的功能,但是,即便如此,许多系统都使用big-endian,这可能意味着big-endian也有一些优势(如果是这样,哪个?)。
我确信还有更多内容,最有可能深入到硬件层面。很想知道细节。
答案 0 :(得分:23)
我已经浏览了一下这个问题的更多信息,并且有很多答案和推理可以解释为什么大或小的字节顺序可能是首选的。我会尽力在这里解释一下我找到的东西:
little-endianness的明显优势在于你在问题中已经提到过的事实......给定数字可以从同一个内存地址读取为多个不同位数的事实。正如维基百科关于该主题的文章所述:
虽然这个little-endian属性很少被高级程序员直接使用,但它通常由代码优化器和汇编语言程序员使用。
因此,涉及多个精度的数学函数更容易编写,因为字节重要性总是对应于内存地址,而对于大端数字,情况并非如此。这似乎是反复引用的小端的论点......由于它的普遍性,我不得不假设这种排序的好处是相对重要的。
我发现另一个有趣的解释是加法和减法。在添加或减去多字节数时,必须首先获取最低有效字节,以查看是否存在更重要字节的残留。由于最小有效字节首先以小端数字读取,因此系统可以在获取后续字节时并行化并开始计算该字节。
回到维基百科的文章,大端数字的优势在于数字的大小可以更容易估计,因为最重要的数字首先出现。与此事实相关的是,通过简单地检查最低位字节中偏移0处的位,可以很容易地判断数字是正数还是负数。
在讨论big-endianness的好处时还说明了二进制数字的排序是因为大多数人订购的基数为10位数。当从二进制转换为十进制时,这在性能方面是有利的。
虽然所有这些论点都很有趣(至少我认为是这样),但它们对现代处理器的应用是另一回事。特别是,加法/减法参数在8位系统上最有效......
对于我的钱,小端看起来最有意义,并且在查看使用它的所有设备时是迄今为止最常见的。我认为仍然使用big-endianness的原因更多是出于遗留原因而非性能原因。也许曾经有一段时间,给定体系结构的设计者认为big-endianness是优选的小端,并且随着多年来架构的发展,字节序保持不变。
我在这里画的并行是JPEG(大端)。 JPEG是大端格式,尽管几乎所有使用它的机器都是小端的。虽然人们可以问JPEG是大端的有什么好处,但我会冒昧地说,出于所有意图和目的,上面提到的性能论点并没有产生差别。事实上,JPEG是按照这种方式设计的,只要它仍在使用中,就会保持这种状态。
答案 1 :(得分:1)
我认为曾经是第一批处理器的硬件设计师决定哪种字节顺序最适合他们首选/现有/计划的微架构,以便他们从头开始开发芯片。
一旦建立,并且出于兼容性原因,字节顺序或多或少地进行到后代硬件;这将支持'遗产'为什么今天两种存在的争论。