测试大端

时间:2013-02-02 09:43:40

标签: c gcc endianness

  

可能重复:
  Little vs Big Endianess: How to interpret the test

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

修改

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

#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;
}

1 个答案:

答案 0 :(得分:4)

作为一个程序?

#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_tuint8_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”,因为big-endian机器会将'a'字符解释为int中最重要的字节。

第二个printf将只打印“abcd”,因为u的值已经从i来回逐字复制。