【发布时间】:2019-05-10 09:43:33
【问题描述】:
我发现这段代码在一个更大的项目中被截断,这真的让我思考。
float sift_handler(int rs2, int rs4, int rs5);
int result1;
float temp = sift_hander(rs2, rs4, rs5);
result1 = *(int*)&temp;
据我了解,float temp 的地址被转换为 int 指针,然后被取消引用。当我编译这段代码时,我得到一个警告
warning: dereferencing type-punned pointer will break strict-aliasing rules
这样做的真正好处是什么?
result1 = temp?另外,使用round() 比只进行投射更好吗?
【问题讨论】:
-
它将给出该浮点数的二进制表示,而不是它所持有的值。它直接查看内存并将其解释为整数
-
相关(C和C++):stackoverflow.com/q/346622/5470596
-
违反严格的别名规则
-
@nwp 不是用任何一种语言取消引用
result1吗? -
@Bathsheba 也是 C 中的 UB,至少基于 C18 标准草案(N2176),那里没有变化……