#include <stdio.h>
union Endian
{
int i;
char c[sizeof(int)];
};
int main(int argc, char *argv[])
{
union Endian e;
e.i = 1;
printf("%d \n",&e.i);
printf("%d,%d,\n",e.c[0],&(e.c[0]));
printf("%d,%d",e.c[sizeof(int)-1],&(e.c[sizeof(int)-1]));
}
输出:
1567599464
1,1567599464,
0,1567599467
LSB存储在较低的地址中,而MSB存储在较高的地址中。这不是大端吗?但我的系统配置将其显示为小端架构。
您的系统绝对是little-endian
。如果是big-endian
,则以下代码:
printf("%d,%d,\n",e.c[0],&(e.c[0]));
将0
打印为第一个%d
,而不是1
。在little-endian
1中存储为
00000001 00000000 00000000 00000000
^ LSB
^Lower Address
但在big-endian
中,它存储为
00000000 00000000 00000000 00000001
^LSB
^Higher Address
并且不要使用%d
打印变量的地址,请使用%p
。
对于little endian,最低有效位存储在第一个字节中(具有最低地址)。
这就是您所看到的,因此似乎很理智;)
00000001 (Hexadecimal: 32 bits)
^^ ^^
MS LS
Byte Byte
最低地址的最低有效字节=> 小尾数。整数从其小端开始放置到内存中,starting。因此得名。
[您将包含“ 1”(最低有效)的字节作为第一个元素(e.c [0]),将包含“ 0”的字节作为第二个元素(e.c [1])。这是小端的,不是吗?
您对什么是大字节序和什么是小字节序错了。阅读this
对我很好。 “ little endian”(又名“正确方式” :-)的意思是“先存储低位字节”,这正是您的代码所显示的。 (顺便说一句,您应该使用“%p”打印地址)。