测试大端序

8
可能有重复:
小端与大端:如何解释测试结果

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

2
包含 endian.h 并尝试类似这样的代码 if __BYTE_ORDER == __LITTLE_ENDIAN - Eddy_Em
2
任何在线的“编译器农场”几乎可以确定都是基于x86架构的。购买其他类型的设备成本非常高昂... - Mats Petersson
1
我建议编写不关心整数基础字节顺序的代码... - autistic
1
@modifiablelvalue:并非总是可行的。但我不确定这里是否适用。 - Ed S.
@modifiablelvalue:真的吗?并不是所有的编程都是通过抽象表示完成的。你认为这些抽象来自哪里?程序员写出来的。上周我还不得不写一个转换例程。没有什么花哨的东西,只是通过libtiff写出一些16 bpp图像数据,它期望大端。 - Ed S.
显示剩余7条评论
1个回答

6
作为一个程序?
#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;
}

在小端架构中,最不重要的字节存储在最前面。在大端架构中,最重要的字节存储在最前面。因此,通过将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”,因为大端机器将字符'a'解释为int中最高有效字节。
第二个printf将只打印“abcd”,因为u的值已经从i逐字节地复制来回。

1
谢谢您的回答,不,我不想知道大端序是什么,我想在大端序下运行一段代码。 - David Ranieri
谢谢,Sheu,你能看到我的编辑吗? - David Ranieri
2
该程序会调用未定义行为。 - user529758
1
@sheu 你正在访问一个联合体中不活跃的字段。 - user529758
3
根据C标准的J1附录规定,“对于与最后存储的成员不同的联合成员对应的字节的值”是未指定的。在混合大小端系统中,或者当所有零比特模式对应于非零值时,上述程序是错误的。 - autistic
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接