您建议的联合方法是大多数人会采取的通常路线。但是,在 C/C++ 中,从联合中读取与最近编写的成员不同的成员在技术上是未定义的行为。尽管如此,它在几乎所有编译器中都得到了很好的支持。
正如Jon Skeet 所建议的那样,强制转换指针是一个坏主意——这违反了C 的严格别名规则。激进的优化编译器会为此生成不正确的代码,因为它假定类型的指针unsigned long *
并且float *
永远不会相互别名。
就标准合规性而言(即不调用未定义的行为),最正确的方法是通过 a 进行强制转换char*
,因为严格的别名规则允许指char*
针对任何其他类型的指针进行别名:
unsigned long ul = 0x40A00000;
float f;
char *pul = (char *)&ul; // ok, char* can alias any type
char *pf = (char *)&f; // ok, char* can alias any type
memcpy(pf, pul, sizeof(float));
虽然老实说,我只会使用联合方法。从上面的 cellperformance.com 链接:
这是一个非常常见的习惯用法,并且得到所有主要编译器的良好支持。实际上,以任何顺序对工会的任何成员进行读写都是可以接受的做法。