什么决定字节序?

Tim*_*Tim 10 cpu operating-systems endian

  1. 我想知道字节序是否仅取决于 CPU?
  2. 它是否依赖于其他硬件,例如内存、辅助存储设备?
  3. 它取决于操作系统吗?为什么在维基百科中,它似乎是真的?

Law*_*ceC 15

  1. CPU 控制字节序。一些 CPU 可以在 big-endian 和 little-endian 之间切换。x86/amd64 架构不具备此功能。

  2. 字节序是一个隐含的东西,在 CPU 上有加载和存储指令。一个字节(0-255)无法容纳的数据需要以一系列多个字节进行读写,显然这些字节需要以一致的顺序读写。CPU 的设计者还必须选择读取和写入寄存器字节的顺序。如果数据永远不会离开 CPU 或 RAM,那么顺序并不重要,但是当您遇到诸如将数据写入 I/O 寄存器(可能不期望相同顺序)和磁盘扇区(其他系统可能会读取数据的地方)之类的事情时) 然后它变得重要并且需要一个外部标准。该标准通常是硬件规范或文件格式规范的一部分。任何称职的程序员/设计都会设计持久性格式以考虑到这一点,

  3. 操作系统大量处理 I/O 寄存器和磁盘扇区,因此 #2 在这里适用。在所有 CPU 之间需要一个通用标准的一个特别重要的领域是文件系统的实现。这就是为什么有独立的mipsmipsel构建的 Debian 而没有的原因。


jkj*_*jkj 12

当一个数字太大而无法容纳一个字节时,字节序是关于数字数据的。例如,ASCII 文本只是一行中的字节,与字节序无关。

如果我们在 32 位(4 字节)整数中放入一个像42这样的小数,我们会看到大端(BE)只使用最后一个字节而小端(LE)只使用第一个字节

|    | byte[0] | byte[1] | byte[2] | byte[3] |
|----+---------+---------+---------+---------|
| BE |       0 |       0 |       0 |      42 |
| LE |      42 |       0 |       0 |       0 |
Run Code Online (Sandbox Code Playgroud)

架构字节序是 CPU 字节序。RAM 不做数学运算,所以它不在乎。

像声卡这样的设备确实很在意(例如,16 位 44100kHz 音频主要是 BE),但是操作系统(设备驱动程序)有责任告诉 CPU 在发送到声卡之前可能转换字节序。

在网络中,大多数情况下都是 big endian,因此 OS 必须在构建网络数据包时告诉 little endian 处理器字节交换整数。

文件系统有两种字节序。例如,FAT32 是 LE,因此在使用 FAT32 时,只有 BE 架构必须进行字节交换。

在 C 网络编程中,您必须记住使用htonl()ntohl()- 函数在主机(本机)和网络字节顺序之间进行转换。当程序在大端系统上编译时,函数什么都不做。在小端系统上,它们交换字节顺序。


架构字节序是字节级别的。在考虑架构字节序时,位的顺序/编号大多无关紧要。但是知道总是很高兴:)

大致上 LSB(最低有效位)在前是位世界的 LE,而 MSB(最高有效位)在前是位世界的 BE。

即使在 SPARC 等大端系统上,大多数 CPU 和串行总线似乎也是(令人惊讶的)LSB。尽管字节大多按大端顺序排列,但以太网也是 LSB。另一方面,例如 PPC 是大端和 MSB 优先。


And*_*ert 5

字节顺序是处理器放置二进制数位的简单顺序。RAM 不关心数据以什么顺序保存到其中,硬盘也不关心(因为它们本身不对数据流的内容采取任何操作,只是执行处理器/芯片组关于将其放置在何处的指令。)操作系统可以构建为支持两种字节序(例如 Mac OS X)。