大端或小端对结构成员有什么影响?

时间:2018-08-16 08:24:53

标签: c endianness

给出以下代码片段:

#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]等索引,因此,那么架构如何影响数组的表示?

请解释。

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。