小端或大端

时间:2013-05-06 09:37:36

标签: c math arithmetic-expressions

#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存储在高位地址中。这不应该是大端吗?但是我的系统配置将它显示为一个小端架构。

6 个答案:

答案 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;的小端即可。整数被放入内存,从它的小端开始。因此这个名字。

Endianness

答案 3 :(得分:1)

您将包含“1”(最低有效)的字节作为第一个元素(e.c [0]),包含“0”的字节作为第二个元素(e.c [1])。这是litte endian,不是吗?

答案 4 :(得分:1)

你对Big endian和什么是little endian错了。阅读this

答案 5 :(得分:0)

对我来说很好看。 “little endian”(又名“正确的方式”:-)表示“先存储的低位字节”,这正是您的代码所显示的内容。 (顺便说一下,你应该使用“%p”打印地址)。