是否有一种简单的方法可以使用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;
}
答案 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_t
与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”,因为big-endian机器会将'a'
字符解释为int中最重要的字节。
第二个printf
将只打印“abcd”,因为u
的值已经从i
来回逐字复制。