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

时间:2016-03-10 14:40:25

标签: 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;

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 

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

4 个答案:

答案 0 :(得分:5)

  

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

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

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

e.g。如果你有

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

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

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

以下是more,了解此概念。

答案 1 :(得分:1)

您是否使用char *访问int的表示?如果没有,则字节顺序不会有任何差别。

通过将地址写为整数,您犯了很大的心理错误。别这么做!

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

没有任何关于字节序的东西。

答案 2 :(得分:1)

没有。 Little Endian vs Big Endian只对你使用不同的类型很重要。只要您只使用整数,差异就会被抽象出来。

single_lines = [] current = [] for i in lines: i = i.strip() if i: current.append(i) else: if not current: continue # treat multiple blank lines as one single_lines.append(' '.join(current)) current = [] else: if current: # collect the last line if the file doesn't end with a blank line single_lines.append(' '.join(current)) 是一个整数数组,因此它引用了一个int对齐的内存地址的集合,根据系统的字节顺序进行解释。

i是一个整数指针,因此它只能引用int对齐的内存地址,根据系统的字节顺序进行解释。

如果您在代码中的某处使用了pchar *,那么字节序可能很重要。

答案 3 :(得分:0)

Endianess仅在访问大小为2字节或更大的任何整数类型的单个字节时才有意义。

您的代码不会执行此操作,因此它不依赖于endianess。

就是这样。