关于计算机科学:为什么使用小端和大端?

Why are both little- and big-endian in use?

为什么在40年的二进制计算机科学之后,小尾数法和大尾数法仍然在使用?是否有算法或存储格式可以更好地与一个一起工作,而与另一个一起工作则更差?如果我们都换了一个,坚持下去,那不是更好吗?


当添加两个数字(在纸上或机器中)时,从最低有效数字开始,朝最高有效数字前进。(许多其他操作也是如此)。

在Intel8088上,它有16位寄存器,但有一个8位数据总线,作为小endian,允许这样的指令在第一个内存周期后开始操作。(当然,一个单词的记忆提取应该可以按降序进行,而不是按升序进行,但我怀疑这会使设计稍微复杂一点。)

在大多数处理器上,总线宽度与寄存器宽度匹配,因此这不再具有优势。

另一方面,可以从MSB开始比较big endian数(尽管许多比较指令实际上执行了一个减法,但无论如何都需要从LSB开始)。符号位也很容易获得。

Are there algorithms or storage
formats that work better with one and
much worse with the other?

不,这里和那里都有小的优势,但没有什么大的优势。

实际上,我认为litte endian更自然和一致:bit的意义是2^(位_pos+8*字节_pos)。而对于big endian,位的意义是2^(位_pos+8*(字_大小-字节_pos-1))。

Wouldn't it be better if we all switched to one and stick with it?

由于x86的统治地位,我们肯定会被小endian所吸引。许多移动设备中的ARM芯片都具有可配置的端隙,但通常设置为le,以便与x86世界更兼容。我没意见。


小endian使类型转换更容易。例如,如果您有一个16位的数字,您可以简单地将相同的内存地址作为指向8位数字的指针,因为它包含最低的8位。因此,您不需要知道正在处理的确切数据类型(尽管在大多数情况下,您确实知道)。

big endian的可读性要高一些。位按照逻辑顺序(首先是最重要的值)存储在内存中,就像任何人类使用的数字系统一样。

在许多抽象层的时候,这些参数实际上不再重要了。我认为我们仍然拥有这两者的主要原因是没有人想转换。这两种系统都没有明显的原因,那么,如果旧系统工作得很好,为什么还要更改任何内容呢?


大尾数法和小尾数法都有各自的优点和缺点。即使有一个明显的优越性(事实并非如此),任何遗留的体系结构都不可能切换到端节点,所以我担心您将不得不学习如何使用它。