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 字节或更大的任何整数类型的单个字节时,字节序才重要。
您的代码不执行此操作,因此它不依赖于字节顺序。
仅此而已。
我遇到了以下问题:
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 字节或更大的任何整数类型的单个字节时,字节序才重要。
您的代码不执行此操作,因此它不依赖于字节顺序。
仅此而已。