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位。