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

Bil*_*dor 2 c pointers endianness

我遇到了以下问题:

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;
Run Code Online (Sandbox Code Playgroud)

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

在以下陈述之后,p等于什么?

p = &i[2] + 4;
i[0] = *(p + 5) - 8;
Run Code Online (Sandbox Code Playgroud)

结果:

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

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

gio*_*gim 5

在以下陈述之后,p等于什么?

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

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

例如,如果你有

int x = 1;
unsigned char * y = (unsigned char*) &x;
Run Code Online (Sandbox Code Playgroud)

然后*y在小端机器上等于1,在大端机器上等于0.


如果客户端将此数组发送到另一台机器,那么还有一点不同的故事,然后它取决于客户端如何序列化(例如哪个字节序)以及服务器如何解释它.然后,endianess问题可能会发挥作用(例如,因为客户端和服务器可能具有不同的字节顺序).

这里有更多阅读,让您了解这个概念.