ere*_*eOn 13 c++ standards endianness unions
今天早上我和一位同事讨论了关于检测字节序的"编码技巧"的正确性.
诀窍是:
bool is_big_endian()
{
union
{
int i;
char c[sizeof(int)];
} foo;
foo.i = 1;
return (foo.c[0] == 1);
}
Run Code Online (Sandbox Code Playgroud)
对我来说,似乎这种用法union
是不正确的,因为设置联合的一个成员并读取另一个成员的定义并不明确.但我必须承认,这只是一种感觉,我缺乏实际的证据来强化我的观点.
这个技巧是否正确?谁在这?
Pra*_*rav 11
您的代码不可移植.它可能适用于某些编译器,也可能不适用.
当您尝试访问联合的非活动成员时,您对于未定义的行为是正确的[就像给出的代码一样]
$ 9.5/1
在联合中,最多一个数据成员可以在任何时间处于活动状态,也就是说,最多一个数据成员的值可以随时存储在并集中.
所以foo.c[0] == 1
不正确,因为c
那时不活跃.如果你认为我错了,请随意纠正我.
不要这样做,更好地使用以下内容:
#include <arpa/inet.h>
//#include <winsock2.h> // <-- for Windows use this instead
#include <stdint.h>
bool is_big_endian() {
uint32_t i = 1;
return i == htonl(i);
}
Run Code Online (Sandbox Code Playgroud)
说明:
htonl函数将u_long从主机转换为TCP/IP网络字节顺序(这是big-endian).
参考文献:
归档时间: |
|
查看次数: |
2368 次 |
最近记录: |