C 大端点或小端点对结构构件的影响是什么?

C 大端点或小端点对结构构件的影响是什么?,c,endianness,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; } #包括 #包括 联合xyz { int j;

给出以下代码片段:

#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;

}
#包括
#包括
联合xyz
{
int j;
charb[2];
}y;
内部主(空)
{
y、 j=520;
printf(“%d%d”,y.b[0],y.b[1]);
y、 b[0]=2;
printf(“%d”,y.j.);
返回0;
}
对于这段代码,我不知道系统是小端还是大端,如果y.j是520,那么表示为:

0000001000001100,所以y.b[0]应该是2,y.b[1]应该是4,但我得到y.b[0]作为4,y.b[1]作为2,我的机器是little endian,但我不知道架构如何影响y.b[0]和y.b[1]的表示

在我看来,每当我们创建数组时,没有什么比数组的最高有效字节和最低有效字节更好的了,我们有像b[0]、b[1]、b[2]等索引,那么架构是如何影响数组的表示的呢


请解释。

您的机器是little endian。因此,最低有效字节首先存储。对于您的示例,它是0x08。上限字节将为0x02

y.b[0]
访问内存中的第一个字节。不是从左到右的第一个字节,因为数字写在页面上。因此
y.b[0]
访问0x08,而
y.b[1]
访问存储在内存中的第二个字节,即0x02


如果您的机器是big-endian(int为16位),那么存储在内存中的int的第一个字节将是0x02,第二个字节将是0x08。因此
y.b[0]
将访问0x02,而
y.b[1]
将访问存储在内存中的第二个字节,即0x08。

您的机器是little endian。因此,最低有效字节首先存储。对于您的示例,它是0x08。上限字节将为0x02

y.b[0]
访问内存中的第一个字节。不是从左到右的第一个字节,因为数字写在页面上。因此
y.b[0]
访问0x08,而
y.b[1]
访问存储在内存中的第二个字节,即0x02


如果您的机器是big-endian(int为16位),那么存储在内存中的int的第一个字节将是0x02,第二个字节将是0x08。因此
y.b[0]
将访问0x02,而
y.b[1]
将访问存储在内存中的第二个字节,即0x08。

为了安全起见,让我们使用
short int
,它更可能是16位

union xyz {
    short int j;
    char b[2];
} y;
所以在你说

y.j = 520;
然后
y.j
如下所示:

     +-------------+
y.j: |         520 |
     +-------------+
     +------+------+
y.b: | 0x02 | 0x08 |
     +------+------+
        [0]    [1]
     +------+------+
y.b: | 0x08 | 0x02 |
     +------+------+
        [0]    [1]
在big-endian机器上
y.b
如下所示:

     +-------------+
y.j: |         520 |
     +-------------+
     +------+------+
y.b: | 0x02 | 0x08 |
     +------+------+
        [0]    [1]
     +------+------+
y.b: | 0x08 | 0x02 |
     +------+------+
        [0]    [1]
在小型endian机器上
y.b
如下所示:

     +-------------+
y.j: |         520 |
     +-------------+
     +------+------+
y.b: | 0x02 | 0x08 |
     +------+------+
        [0]    [1]
     +------+------+
y.b: | 0x08 | 0x02 |
     +------+------+
        [0]    [1]

为了安全起见,让我们使用
short int
,它更可能是16位

union xyz {
    short int j;
    char b[2];
} y;
所以在你说

y.j = 520;
然后
y.j
如下所示:

     +-------------+
y.j: |         520 |
     +-------------+
     +------+------+
y.b: | 0x02 | 0x08 |
     +------+------+
        [0]    [1]
     +------+------+
y.b: | 0x08 | 0x02 |
     +------+------+
        [0]    [1]
在big-endian机器上
y.b
如下所示:

     +-------------+
y.j: |         520 |
     +-------------+
     +------+------+
y.b: | 0x02 | 0x08 |
     +------+------+
        [0]    [1]
     +------+------+
y.b: | 0x08 | 0x02 |
     +------+------+
        [0]    [1]
在小型endian机器上
y.b
如下所示:

     +-------------+
y.j: |         520 |
     +-------------+
     +------+------+
y.b: | 0x02 | 0x08 |
     +------+------+
        [0]    [1]
     +------+------+
y.b: | 0x08 | 0x02 |
     +------+------+
        [0]    [1]

您确定在您的系统上int仅为两个字节吗?为了安全起见,您应该使用int16_t或类似的名称。您确定在您的系统上int仅为两个字节吗?为了安全起见,你应该使用int16\u t或类似的。为了安全起见,最好使用
(u)int16\u t
,但是是的
short int
很可能是16位。为了安全起见,最好是使用
(u)int16\u t
,但是是的
short int
很可能是16位。