给出以下代码片段:
#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;
}
对于此代码,我不确定系统是小端还是大端,如果y.j为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]等索引,因此,那么架构如何影响数组的表示?
请解释。
答案 0 :(得分: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]
在小端机上,y.b
如下所示:
+------+------+
y.b: | 0x08 | 0x02 |
+------+------+
[0] [1]
答案 1 :(得分:0)
您的机器是小端的。因此,最低有效字节将首先存储。对于您的示例是0x08。高字节为0x02。
groups = df.groupby('Feed')
fig, ax = plt.subplots()
for name, group in groups:
ax.plot(group.Day, group.Aprop,
marker='o', linestyle='', ms=3,
label=name
)
ax.legend()
plt.show()
访问内存中的第一个字节。由于数字是写在页面上的,因此不是从左到右的第一个字节。因此y.b[0]
访问0x08,而y.b[0]
访问存储在内存中的第二个字节,即0x02。
如果您的计算机是big endian(且ints为16位),则存储在内存中的int的第一个字节将为0x02,第二个字节将为0x08。因此y.b[1]
将访问0x02,而y.b[0]
将访问存储在内存中的第二个字节,即0x08。