什么是C中的陷阱表示(某些示例可能有帮助)?这适用于C++吗?
float f=3.5;
int *pi = (int*)&f;
Run Code Online (Sandbox Code Playgroud)sizeof(int) == sizeof(float)do f和*pi具有相同的二进制表示/模式?MSVC怎么样?有没有一种方法可以在C和C ++中都有效?最好是较低的开销,并避免琐碎的预处理程序入侵。
在C89中,我知道我可以做这样的事情:
unsigned int float_bits(float num) {
return *(unsigned int *)#
}
Run Code Online (Sandbox Code Playgroud)
但是,这违反了C99的严格别名规则。因此,这样的事情在各种C标准中可能更易于移植:
unsigned int float_bits(float num) {
union { float f; unsigned int i; } u;
u.f = num;
return u.i;
}
Run Code Online (Sandbox Code Playgroud)
但是我知道这不是有效的C ++,因为一次联盟中只有一个成员可以处于“活动”状态。为C和C ++提供的典型解决方案是这样的:
unsigned int float_bits(float num) {
unsigned int i;
memcpy(&i, &num, sizeof(int));
return i;
}
Run Code Online (Sandbox Code Playgroud)
但是,这依赖于编译器能够优化对memcpy的调用。memcpy是唯一可跨C和C ++标准移植的方法吗?