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

Sid*_*ria 0 c endianness

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

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

[编辑]

它必须在不使用任何铸件的情况下完成.我找不到一个问题,我们可以在不投射和使用宏的情况下完成它.此处的隐式转换是指编译器自动转换.从char到int说.

R..*_*R.. 5

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

如果你想欺骗和访问表示,但没有看起来像演员,这里有一些想法:

int i = 1;
char c;
memcpy(&c, &i, 1);
c;
Run Code Online (Sandbox Code Playgroud)

要么:

union { int i; char c; } x = { 1 };
x.c;
Run Code Online (Sandbox Code Playgroud)

要么:

int i = 1;
FILE *f = tmpfile();
fwrite(&i, sizeof i, 1, f);
rewind(f);
getc(f);
Run Code Online (Sandbox Code Playgroud)

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

htonl(1) != 1;
Run Code Online (Sandbox Code Playgroud)

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

  • union*不是**,但就像我说的那样,我认为你的意思是"访问表示",而不是铸造.在这种情况下,问题是无法解决的.没有表示的C不具有字节顺序,只有Perl或Lua具有字节顺序. (3认同)