#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存储在高位地址中。这不应该是大端吗?但是我的系统配置将它显示为一个小端架构。
答案 0 :(得分:3)
你的系统肯定是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
。
答案 1 :(得分:2)
对于小端,最低有效位存储在第一个字节中(具有最低地址)。
这就是你所看到的,所以似乎有理智;)
答案 2 :(得分:2)
00000001 (Hexadecimal: 32 bits)
^^ ^^
MS LS
Byte Byte
最低地址的最低有效字节=&gt;的小端即可。整数被放入内存,从它的小端开始。因此这个名字。
答案 3 :(得分:1)
您将包含“1”(最低有效)的字节作为第一个元素(e.c [0]),包含“0”的字节作为第二个元素(e.c [1])。这是litte endian,不是吗?
答案 4 :(得分:1)
你对Big endian和什么是little endian错了。阅读this
答案 5 :(得分:0)
对我来说很好看。 “little endian”(又名“正确的方式”:-)表示“先存储的低位字节”,这正是您的代码所显示的内容。 (顺便说一下,你应该使用“%p”打印地址)。