在没有隐式/显式转换的情况下在C中查找Endianness

时间:2015-01-16 16:01:54

标签: c endianness

我期待找到一种方式,我可以在没有隐式/显式转换,循环,切换,内置函数,宏的情况下找到字节序。我尝试过代码,但它使用显式转换。

int is_little_endian(){
    int temp = 1;
    return *(char *) temp;//Returns 1 if it's a little endian machine.
}

[编辑]

必须在不使用任何铸件的情况下完成。我无法找到一个问题,我们可以在不抛弃和使用宏的情况下完成这个问题。此处的隐式强制转换是指编译器自动强制转换。从char到int。说。

3 个答案:

答案 0 :(得分:5)

没有“隐式转换”这样的东西 - 转换是一个显式的运算符。但是,如果您正在寻找的是一种在不检查对象的表示的情况下观察字节序的方法,那么就没有办法了。 Endianness纯粹是表示的属性,而不是值的属性,因此如果您限制自己访问表示,则它不存在。这就是大多数优秀代码不应该关心字节序的原因。

如果您确实想作弊和访问表示,但如果没有看起来像演员,这里有一些想法:

int i = 1;
char c;
memcpy(&c, &i, 1);
c;

或:

union { int i; char c; } x = { 1 };
x.c;

或:

int i = 1;
FILE *f = tmpfile();
fwrite(&i, sizeof i, 1, f);
rewind(f);
getc(f);

或使用任何可能会为您做这样的事情的库函数。如果您在POSIX系统或任何其他具有套接字操作的系统上,您也可以执行以下操作:

htonl(1) != 1;

但是所有这些都依赖于检查表示,或者实现中关于目标字节顺序的硬编码假设。

答案 1 :(得分:2)

为什么不试试

unsigned int i= 1;
char *p = &i;

if(*p)
    printf("Little endian\n");
else
    printf("Big endian\n");

答案 2 :(得分:1)

这是通过编译器本身完成的。

int is_little_endian(void) {
#ifdef _LITTLE_ENDIAN
    return 1;
#else
    return 0;
#endif
}

当为小端目标构建程序时,在构建命令中定义_LITTLE_ENDIAN(通常通过添加-D_LITTLE_ENDIAN)。如果程序是为大端目标构建的,请在构建命令(-D_BIG_ENDIAN)中定义_BIG_ENDIAN。

以上示例将在运行时通知您是否为小端目标构建。

但是,由于字节序在运行时不太可能发生变化,因此我认为在运行时这样做并没有多大价值。而是利用C预处理器以及通过命令行传入定义来完成所需的功能。

希望这有帮助。