小端或大端

问题描述 投票:2回答:6
#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存储在较高的地址中。这不是大端吗?但我的系统配置将其显示为小端架构。

c math arithmetic-expressions
6个回答
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


2
投票

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

这就是您所看到的,因此似乎很理智;)


2
投票
00000001 (Hexadecimal: 32 bits)
^^    ^^
MS    LS
Byte  Byte

最低地址的最低有效字节=> 小尾数。整数从其小端开始放置到内存中,starting。因此得名。

Endianness


1
投票

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


1
投票

您对什么是大字节序和什么是小字节序错了。阅读this


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.