Little Endian 与 Big Endian 数据结构会改变我的答案吗?

Would a Little Endian vs Big Endian data structure change my answer?

我遇到了以下问题:

int i[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; 
int *p;

with i[0] 在具有 32 位整数的 Big Endian 机器上从地址 1,242 开始。

下面语句后的 p 等于什么?

p = &i[2] + 4;
i[0] = *(p + 5) - 8;

结果:

p = 1242 + 4 * (2 + 4) = 1,266
i[0] = i[(6 + 5)] – 8 = 3 

如果这是在 Little E 机器上,我的解决方案会改变吗?

What does p equal after the following statement?

p 将具有相同的值。您只是为它分配了一些地址 - 例如这里:p = &i[2] + 4,这与字节顺序无关。

如果你 运行 在同一台机器上 整个代码,i[0] 的值也不会改变;因为您正在对 "whole" 整数进行操作,而不是使用 char 指针读取 4 字节整数的第一个字节。

例如如果你有

int x = 1;
unsigned char * y = (unsigned char*) &x;

那么 *y 在小端机器上等于 1,在大端机器上等于 0。


如果客户端将此数组发送到另一台机器,则情况也会有所不同,这完全取决于客户端如何序列化它(例如,哪种字节顺序)以及服务器如何解释它。然后可能会出现字节顺序问题(例如,因为客户端和服务器可能具有不同的字节顺序)。

这里是 more 阅读以帮助您理解这个概念。

您是否正在使用 char* 访问 int 的表示形式?如果不是,那么字节顺序不会有任何区别。

您将地址写成整数,这是一个巨大的心理错误。不要那样做!

&i[2]是i[2]的地址。 如果你加 4 你得到 i [6] 的地址。 p+5给出了i[11]的地址,*(p+5)是i[11]中存储的数。

与字节序无关。

没有。 Little Endian 与 Big Endian 仅在您使用不同类型时才重要。只要您只使用整数,差异就会被抽象掉。

i是一个整型数组,所以指的是int对齐内存地址的集合,按照系统的字节顺序进行解释。

p是整型指针,所以只能引用int对齐的内存地址,按照系统的字节序来解释。

如果您在代码中的某处使用 char *void *,字节顺序可能很重要。

仅当您访问大小为 2 字节或更大的任何整数类型的单个字节时,字节序才重要。

您的代码不执行此操作,因此它不依赖于字节顺序。

仅此而已。