7

可能重复:
Little vs Big Endianess:如何解释测试

是否有一种简单的方法可以使用 gcc 或任何在线编译器(如 ideone 用于大端)来测试代码?我不想使用 qemu 或虚拟机

编辑

有人可以解释这段代码在使用大端的系统上的行为吗?

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main (void)
{
    int32_t i;
    unsigned char u[4] = {'a', 'b', 'c', 'd'};

    memcpy(&i, u, sizeof(u));
    printf("%d\n", i);
    memcpy(u, &i, sizeof(i));
    for (i = 0; i < 4; i++) {
        printf("%c", u[i]);
    }
    printf("\n");
    return 0;
}
4

1 回答 1

5

作为程序?

#include <stdio.h>
#include <stdint.h>

int main(int argc, char** argv) {
    union {
       uint32_t word;
       uint8_t bytes[4];
    } test_struct;
    test_struct.word = 0x1;
    if (test_struct.bytes[0] != 0)
        printf("little-endian\n");
    else
        printf("big-endian\n");
    return 0;
}

在 little-endian 架构上,首先存储最低有效字节。在大端架构上,最重要的字节首先存储。uint32_t所以通过用 a覆盖 a uint8_t[4],我可以检查哪个字节先出现。见:http ://en.wikipedia.org/wiki/Big_endian

GCC 特别将__BYTE_ORDER__宏定义为扩展。您可以针对__ORDER_BIG_ENDIAN__, __ORDER_LITTLE_ENDIAN__, 和__ORDER_PDP_ENDIAN__(我不知道存在!)进行测试——参见http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

另见http://en.wikipedia.org/wiki/Big_endian


至于以与您的机器的本机字节序不匹配的字节序运行代码,那么您将不得不在具有不同字节序的架构上编译和运行它。所以你需要交叉编译,并在模拟器或虚拟机上运行。


编辑:啊,我没有看到第一个printf()

第一个printf将打印“1633837924”,因为大端机器会将'a'字符解释为 int 中的最高有效字节。

第二个printf将只打印“abcd”,因为 的值u已从i.

于 2013-02-02T09:48:44.837 回答