c - Big-endian 或 Little-endian 对结构成员的影响是什么?
问题描述
给出以下代码片段:
#include <stdio.h>
#include<string.h>
union xyz
{
int j;
char b[2];
}y;
int main(void)
{
y.j=520;
printf("%d %d",y.b[0],y.b[1]);
y.b[0]=2;
printf(" %d ",y.j);
return 0;
}
对于这段代码,我不知道系统是小端还是大端,如果 yj 是 520,那么我们的表示形式为:
0000001000000100 ,所以 yb[0] 应该是 2 并且 yb[1] 应该是 4 ,但是我得到 yb[0] 为 4 和 yb[1] 为 2 ,我的机器是 little-endian ,但我没有得到架构如何影响 yb[0] 和 yb[1] 的表示?
在我看来,每当我们创建数组时,都没有数组的最高有效字节和数组的最低有效字节,我们有 b[0]、b[1]、b[2] 等索引,那么如何影响数组表示的架构?
请解释 。
解决方案
为了安全起见,让我们使用short int
,它更有可能是 16 位。
union xyz {
short int j;
char b[2];
} y;
所以在你说之后
y.j = 520;
然后y.j
看起来像这样:
+-------------+
y.j: | 520 |
+-------------+
在大端机器上y.b
看起来像这样:
+------+------+
y.b: | 0x02 | 0x08 |
+------+------+
[0] [1]
在 little-endian 机器上y.b
看起来像这样:
+------+------+
y.b: | 0x08 | 0x02 |
+------+------+
[0] [1]