![什么决定了字节顺序?](https://linux22.com/image/1282385/%E4%BB%80%E4%B9%88%E5%86%B3%E5%AE%9A%E4%BA%86%E5%AD%97%E8%8A%82%E9%A1%BA%E5%BA%8F%EF%BC%9F.png)
- 我想知道字节顺序是否仅取决于 CPU?
- 它是否依赖于其他硬件,例如内存、辅助存储设备?
- 这取决于操作系统吗?为什么维基百科,看上去是真的吗?
答案1
字节序数字数据当数字太大而无法用一个字节容纳时。例如,ASCII 文本只是一行中的字节,与字节顺序无关。
如果我们把小数字四十二在 32 位(4 字节)整数中,我们看到使用大端字节序(BE)时,只使用最后一个字节和使用小端字节序(LE)时,只使用第一个字节:
| | byte[0] | byte[1] | byte[2] | byte[3] |
|----+---------+---------+---------+---------|
| BE | 0 | 0 | 0 | 42 |
| LE | 42 | 0 | 0 | 0 |
架构字节序是 CPU 字节序。RAM 不进行数学运算,因此它不关心。
声卡等设备确实关心(例如 16 位 44100kHz 音频大多是 BE),但它操作系统(设备驱动程序)负责告诉 CPU 在发送到声卡之前可能需要转换字节顺序。
在网络中,大多数情况下,所有内容都是大端的,因此操作系统必须告诉小端处理器字节交换整数作为网络数据包的构造。
文件系统有两种字节顺序。例如,FAT32 是 LE,因此只有 BE 架构在使用 FAT32 时才需要进行字节交换。
在 C 网络编程中,您必须记住使用htonl()
和ntohl()
函数在主机(本机)和网络字节顺序之间进行转换。当程序在大端系统上编译时,这些函数不执行任何操作。在小端系统上,它们会交换字节顺序。
架构字节序是字节级的事情。考虑架构字节序时,位的顺序/编号几乎无关紧要。但知道这一点总是好的 :)
大致来说,LSB(最低有效位)优先是位世界的 LE,而 MSB(最高有效位)优先是位世界的 BE。
即使在 SPARC 等大端系统上,大多数 CPU 和串行总线似乎(令人惊讶地)都是 LSB。尽管字节大多采用大端顺序,但以太网仍然是 LSB。另一方面,例如 PPC 是大端字节序且 MSB 优先。
答案2
CPU 控制字节序。少数 CPU 可以在大端和小端之间切换。x86/amd64 架构不具备此功能。
字节序是 CPU 上加载和存储指令的一个隐含内容。无法用一个字节 (0-255) 容纳的数据需要以一系列多个字节的形式进行读取和写入,而且显然这些字节需要以一致的顺序进行读取和写入。CPU 的设计人员还必须选择读取和写入寄存器字节的顺序。如果数据从未离开 CPU 或 RAM,则顺序并不重要,但是当您遇到诸如将数据写入 I/O 寄存器(可能不期望相同的顺序)和磁盘扇区(其他系统可能会读取数据)之类的事情时,顺序就变得很重要,并且需要外部标准。此标准通常是硬件规范或文件格式规范的一部分。任何称职的程序员/设计都会在设计持久性格式时考虑到这一点,糟糕的编程或假设事物总是在单一架构上读取的编程可能会暴露错误。
操作系统大量处理 I/O 寄存器和磁盘扇区,因此 #2 适用于此。一个特别重要的领域需要所有 CPU 之间建立通用标准,那就是文件系统的实现。这就是为什么Debian 和其他东西有单独的
mips
版本。mipsel
答案3
字节序很简单,就是处理器将二进制数字的位排列的顺序。RAM 不关心数据以什么顺序保存,硬盘也不关心(因为它们本身不对数据流的内容采取任何行动,只是执行处理器/芯片组的指令,决定将数据放在何处。)操作系统可以构建为同时使用这两种字节序(例如 Mac OS X)。
答案4
字节序不一定取决于 CPU。例如,以太网和大多数 TCP/IP 低级协议都是大端序,无论 CPU 是什么,希望基于 x86 的机器仍能连接到互联网。类似地,在大端序 CPU 上运行的操作系统将读取 FAT32 的小端序文件系统或使用小端序 PCI 卡,等等。