不同的字节序有什么好处?

15

为什么一些处理器制造商决定使用:

  • 小端序
  • 大端序
  • 中端序
  • 还有其他的吗?

我听说,使用大端序可以更快地确定一个数是正数还是负数,因为符号位在第一个位置。(在现代CPU上这已经不重要了,因为无法再访问单个比特。)


7
中间字节序是指你把鸡蛋放在侧面,然后从中间打开吗? - workmad3
中间字节序是PDP-11使用的方案:位15..8,然后7..0,31..24,23..16。 - finnw
1
中间字节序就是16位小端字节序。 - David Sykes
@DavidSykes 大端字节序只是32位小端字节序吗?(或者在现代英特尔芯片上是64位小端字节序?) - SO_fix_the_vote_sorting_bug
5个回答

23

小端序的好处是可以使用相同的地址读取任何长度的变量。

例如,32位变量可以作为8位或16位变量读取而不改变地址。虽然在现代汇编和内存充足的情况下可能受益有限,但在早期内存受限的时代,这可能是一个显著的优势。


2
我不确定大端序是否真正有益处,除了与其他系统兼容性之外。在大多数高级语言中,字节序通常是无关紧要的。 - David Sykes
8
大端字节序的一个优点是,你可以像大多数人一样从左到右读取16位和32位的值。一个包含4个字节的内存转储,其值为“ffaa8800”,在大端字节序下实际上是“0xffaa8800”,而不是小端字节序下的“0x0088aaff”。请注意,这里只是翻译,没有其他解释或额外内容返回。 - PeyloW
@DavidSykes:在这种情况下,改变位序而不是字节顺序会更简单,并且可以达到相同的效果。我认为这更多地涉及电子级别,而不是开发人员所暴露的内容。 - user2284570
3
@user2284570 开发人员的好处是真实的,我和许多其他人在过去使用过它。 - David Sykes
@DavidSykes:是的,但使用翻转器进行位排序会更简单,我不明白为什么要采用反向字节顺序的想法从何而来。 - user2284570
显示剩余5条评论

3

大端和小端本身没有特定的好处,除非使用本机CPU字节序或处理指定的文件字节序。

之所以同时存在大端和小端,是因为不同的CPU制造商使用不同的约定来表示多字节数据,在当时没有出现标准。


学习电子后,我熟悉位序,但字节序似乎非常奇特。 - user2284570
根据英特尔公司的说法,这基本上是一种“错误”,纯粹因为偶然情况而泄露出去。这里的“错误”指的是他们为客户设计了一款芯片,但该客户从未生产过该芯片。这就像一个“为什么时钟向顺时针方向转动?”的问题。 - SO_fix_the_vote_sorting_bug
@SO修复投票排序错误能否提供一个参考来支持你的解释? - Antoine Weber

1
有些操作需要在另一部分值可用之前获取某个值的一部分。当添加两个无符号或补码数字时,这两个数字太大,无法一次性读取,结果的低位可以在上位可用之前计算出来,但反过来不行,这意味着小端序在这里是有优势的。当访问串行闪存芯片时,只有在定义行的所有位(通常是除最低有效的8-12位之外的所有位)都变得可用时,才能开始行解码,这意味着大端序在这里是有优势的。

现代的RAM、解码和执行逻辑通常远远超过8位宽。这只有在旧的或窄的总线/串行PIC上才有意义。 - user246672
@Barry:我所知道的小端优势案例源于在所有上位比特可用之前,能够开始对数字的低位进行操作。这种情况今天出现的频率比过去要少得多,但硬件曾经从这种能力中受益几乎可以肯定是小端常见的原因。 - supercat

1

利用 CPU 的字节序(无论是小端还是大端)可以在算术运算中获得速度优势:您可以直接在内存中添加、减去等多字节整数。

在文件格式中使用预定义的、规定的字节序(无论是小端还是大端)可以使您能够在任何系统上读取该文件,而不管其他系统的 CPU 字节序如何。具有正确字节序的系统可以更快地读取文件(如果读取例程编写和优化得当),但即使具有错误字节序的系统也可以读取它。通常,速度差异微不足道(除了具有大量整数的非常大的文件),因此最好先测量优化读取例程的最大可能速度增益。

一些文件格式(例如 TIFF)支持两种字节序。在这种情况下,假设文件将在同一台机器或类似机器上进行后处理,则使用 CPU 的字节序生成文件是一个好主意。


3
实际上,对于一个大文件而言,即使它只包含整数,如果你需要做的唯一处理是交换它们的顺序,那么你的操作速度将受到从磁盘或网络读取文件的限制。事实上,在现代CPU上,在你的I/O速度变慢之前,你可以完成更多的工作,这就是为什么通常将文件压缩存储在磁盘上,并在处理时动态解压缩,比仅处理未压缩文件要快的原因。 - cjs
请问您能否解释一下字节序对于读取文件的重要性?如果我读取文本文件,它会有什么影响吗? - Geek
2
如果你正在读取一个存储UTF16LE(小端)字符的文本文件,而你的本地格式是UTF16BE(大端),那么你需要在读入字符时反转它们的顺序。然而,正如Curt Samson指出的那样,这可能并没有太大的区别,因为CPU和主内存的速度比磁盘要快得多。 - 1800 INFORMATION
@Geek 当一个二进制文件被读入字节缓冲区时,字节仅按磁盘上出现的顺序抛入内存中。LE 和 BE 决定处理器如何解释内存中的多字节整数。如果在 LE 机器上通过直接将 int 转换为字节缓冲区写入二进制文件,并在 BE 机器上读取并将其直接解释为 int 的字节缓冲区,则会出错。 - user246672

-1
在小端模式下,您不需要更改地址,但在大端模式下,您必须更改地址:http://www.noveltheory.com/techpapers/endian.asp 我实际上不知道在现代CPU中,小端模式是否仍然比大端模式具有优势。我天真地认为切换地址会消耗CPU的皮卡瓦特电量 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接