我期待着一种方法,我可以在没有隐式/显式转换,循环,切换,内置函数,宏的情况下找到字节序.我尝试过代码,但它使用显式转换.
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说.
没有"隐式转换"这样的东西 - 转换是一个显式的运算符.但是,如果您正在寻找的是一种观察字节序而不检查对象表示的方法,那么就没有办法了.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)
但所有这些都依赖于检查表示,或者在实现中关于目标字节顺序的硬编码假设.