不管字节顺序如何,x & 0xFF
都会给你最低有效字节。
首先,您应该了解字节顺序和重要性之间的区别。字节序表示字节写入内存的顺序;它与 CPU 中的任何计算完全无关。意义表示哪些位具有更高的值;它与任何存储系统完全无关。
一旦将内存中的值加载到 CPU 中,字节序就无关紧要了,因为对于 CPU(更准确地说,ALU)来说,重要的是位的重要性。
因此,就 C 而言,0x000000FF
在其最低有效字节中有 1,并且and
用变量对其进行 ing 将给出其最低有效字节。
事实上,在整个 C 标准中,你找不到“endian”这个词。C 定义了一个“抽象机器”,其中只有位的重要性很重要。编译器负责编译程序,使其行为与抽象机器相同,而不管字节顺序如何。因此,除非您期望某种内存布局(例如通过一个union
或一组指针),否则您根本不需要考虑字节序。
另一个你可能感兴趣的例子是转移。同样的事情也适用于换档。事实上,就像我之前所说的,字节序对 ALU 无关紧要,因此无论字节序如何,它<<
总是转换为甚至不是编译器而是 CPU 本身向更重要的位移动。
让我把它们放在一个有两个正交方向的图中,也许你会更好地理解它。从 CPU 的角度来看,这就是加载操作的样子。
在 little-endian 机器上,您有:
MEMORY CPU Register
LSB BYTE2 BYTE3 MSB ----> MSB
\ \ \-----------> BYTE3
\ \----------------> BYTE2
\--------------------> LSB
在大端机器上,您有:
MEMORY CPU Register
/--------------------> MSB
/ /----------------> BYTE3
/ / /-----------> BYTE2
MSB BYTE3 BYTE2 LSB ----> LSB
如您所见,在这两种情况下,您都有:
CPU Register
MSB
BYTE3
BYTE2
LSB
这意味着在这两种情况下,CPU 最终都会加载完全相同的值。