有没有一种方式可以在C和C++中有效地进行类型转换?最好是开销较低且避免使用琐碎的预处理器技巧。
在C89中,我知道我可以这样做:
unsigned int float_bits(float num) {
return *(unsigned int *)#
}
然而,这违反了C99的严格别名规则。因此,像这样的代码可能在各种C标准中更具可移植性:
unsigned int float_bits(float num) {
union { float f; unsigned int i; } u;
u.f = num;
return u.i;
}
但我知道这不是有效的C ++,因为联合体中只能有一个成员“活动”。对于C和C ++,通常给出的解决方案是如下所示:
unsigned int float_bits(float num) {
unsigned int i;
memcpy(&i, &num, sizeof(int));
return i;
}
然而,这取决于编译器能否优化调用memcpy。memcpy是唯一跨C和C++标准可移植的方法吗?
memcpy
。或者干脆不要进行类型转换,这很少有必要 :) - DeiDeimemcpy
是唯一的方法,我们可以将这个问题用作所有此类未来问题的规范重复。 - Richard Crittenmemcpy
比使用(unsigned int *)&num
更可靠(或不可靠)?(如果sizeof(float) != sizeof(int)
,两者都会失败。) - Adrian Molesizeof(float)== sizeof(int)
,*(unsigned int *&num);
也是UB。在这种情况下,memcpy
是有效的,可以使用static_assert
来检查大小是否匹配。 - Richard CrittenT
的变量的有效类型始终为T
,无论是否进行memcpy。 - M.M