【问题标题】:Test big endian [duplicate]测试大端[重复]
【发布时间】:2013-02-02 09:43:39
【问题描述】:

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

是否有一种简单的方法可以使用 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;
}

【问题讨论】:

  • 包括endian.h 并尝试类似if __BYTE_ORDER == __LITTLE_ENDIAN
  • Debian/Ubuntu 上的多架构使 qemu 比您想象的要简单得多...
  • 几乎 100% 确定任何在线“编译器农场”都是基于 x86 的。买其他东西太贵了……
  • 我建议编写不关心整数底层字节顺序的代码...
  • @modifiablelvalue:并非总是可能的。我不知道这里是不是这样。

标签: c gcc endianness


【解决方案1】:

作为一个程序?

#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 架构中,首先存储最低有效字节。在大端架构上,最重要的字节首先存储。因此,通过用uint8_t[4] 覆盖uint32_t,我可以检查哪个字节先出现。见: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


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


edit:啊,我没看到第一个printf()

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

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

【讨论】:

  • 谢谢你的回答,不,我不想知道是否大端,我想在大端下运行一段代码
  • 谢谢sheu,你能看到我的编辑吗?
  • 这个程序调用了未定义的行为。
  • @sheu 您正在访问联合的非活动字段。
  • 嗯,C 标准声明“对应于联合成员的字节值,而不是最后存储的一个”根据附件 J1 未指定。在混合字节序系统的情况下,或者全零的底层位模式对应于非零的东西,上面的程序是错误的。
猜你喜欢
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多