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

4

6 回答 6

3

你系统肯定是little-endian。如果是big-endian的话,下面的代码:

printf("%d,%d,\n",e.c[0],&(e.c[0]));

将打印0第一个%d而不是1. In little-endian1 存储为

00000001 00000000 00000000 00000000
^ LSB
^Lower Address

big-endian其中存储为

00000000 00000000 00000000 00000001
                           ^LSB
                           ^Higher Address  

并且不要使用%d打印变量的地址,使用%p.

于 2013-05-06T09:43:58.663 回答
2

对于little endian,最低有效位存储在第一个字节(具有最低地址)中。

这就是你所看到的,所以看起来很理智;)

于 2013-05-06T09:41:27.183 回答
2
00000001 (Hexadecimal: 32 bits)
^^    ^^
MS    LS
Byte  Byte

最低地址的最低有效字节 => little-endian。整数被放入内存,它的小端开始。由此得名。

字节序

于 2013-05-06T09:43:37.097 回答
1

您将包含“1”(最低有效)的字节作为第一个元素(ec[0]),将包含“0”的字节作为第二个元素(ec[1])。这是小端序,不是吗?

于 2013-05-06T09:42:24.127 回答
1

你对什么是大端和什么是小端是错误的。读这个

于 2013-05-06T09:43:18.083 回答
0

在我看来很好。“小端”(又名“正确的方式”:-) 表示“首先存储的低阶字节”,这正是您的代码所显示的。(顺便说一句,您应该使用“%p”来打印地址)。

于 2013-05-06T09:43:20.150 回答