最近我遇到了一段使用铸造方法的代码,我觉得很奇怪。以下是例子:
inline float asfloat(unsigned int x){
return *(float *) &x;
}
inline float asfloat(int x){
return *(float *) &x;
}
这种方式有什么优势吗?以下“更简单”的代码不会这样做吗?
inline float asfloat(unsigned int x){
return (float)x;
}
inline float asfloat(int x){
return (float)x;
}
答案 0 :(得分:9)
前者执行按位演员,这是 邪恶 (几乎和我一样邪恶)。它接受整数的地址并将其取消引用,就像它是浮点数的地址一样。这也违反了别名规则,因此未定义的行为。
后者将整数转换为保留信息的浮点数:
(float)42 == 42.0 // approximately, due to floating point precision errors
我写了an example,证明两者不相等。
答案 1 :(得分:3)
那些做非常不同的事情。第一个示例将整数中提供的位模式(“表示”)解释为float的位模式。第二个示例将整数的表示数字(“值”)转换为具有最接近的等效值的浮点数。
#include <iostream>
inline float asfloatbits(int x){
return *(float *) &x;
}
inline float asfloatvalue(int x){
return (float)x;
}
int main()
{
int abc = 12341234;
std::cout << asfloatbits(abc) << std::endl;
std::cout << asfloatvalue(abc) << std::endl;
}
答案 2 :(得分:1)
据我了解,第一个采用原始整数值并将其视为浮点数并将其返回。第二个取整数并将其转换为最接近的等效浮点值并返回它。