gpt4 book ai didi

小端大端的混淆

转载 作者:太空狗 更新时间:2023-10-29 17:06:18 24 4
gpt4 key购买 nike

我对小端/大端有些困惑。看来我不见了很简单一些反馈表示赞赏。例如,假设我们有两个函数,它们检索
的最低和最高有效字节32位值:

#define LSB(x) ((x) & 0x000000FF)

#define MSB(x) ((x) & 0xFF000000)

我的问题是:以上两个函数在big endian 和little endian 机器上是否返回正确的结果both

现在我将解释为什么我有困惑。想象一下我们在一台小端机器上。在小端机器上,整数 9 像这样存储在内存中(十六进制):09 00 00 00(最低有效字节在前)现在在某些时候,你可能会想,如果我们使用上面的 LSB 函数,那么我们就会结束加上这样的表达式: 09 00 00 00 & 00 00 00 FF 是 0 - 但当然这不是 above LSB 函数最终的工作方式。所以看来我错过了smth。任何帮助表示赞赏。

此外,如果我说 int y = 0x000000FF - 无论机器的字节序如何,这都是 255,对吗?

最佳答案

无论字节序如何,x & 0xFF会给你最低有效字节。

首先,您应该了解字节序和重要性之间的区别。 Endianness 表示字节写入内存的顺序; 它与 CPU 中的任何计算完全无关。重要性表示哪些位具有更高的值(value); 它与任何存储系统完全无关

一旦您将一个值从内存加载到 CPU,字节顺序就无关紧要了,因为对于 CPU(更准确地说,ALU)而言,重要的是位的重要性。

因此,就 C 而言,0x000000FF在其最低有效字节中有 1s 和 and用一个变量来处理它会给出它的最低有效字节。


其实在整个C标准中,你找不到“endian”这个词。 C 定义了一个“抽象机”,其中只有位的重要性很重要。编译器有责任以与抽象机行为相同的方式编译程序,而不管字节顺序如何。因此,除非您期望某种内存布局(例如通过 union 或一组指针),否则您根本不需要考虑字节顺序。


您可能感兴趣的另一个示例是移动。同样的事情也适用于转移。事实上,正如我之前所说,字节顺序对 ALU 无关紧要,所以 <<总是转换为向更高有效位移动,甚至不是编译器,而是 CPU 本身,无论字节序如何。


让我将它们放在一个具有两个正交方向的图表中,以便您更好地理解它。这就是从 CPU 的角度来看加载操作的样子。

在小端机器上你有:

         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 最终加载了完全相同的值。

关于小端大端的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19408742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com