通过解除引用在C中转换变量

时间:2013-06-14 23:18:07

标签: c++ casting

最近我遇到了一段使用铸造方法的代码,我觉得很奇怪。以下是例子:

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;
}

3 个答案:

答案 0 :(得分:9)

前者执行按位演员,这是 邪恶 (几乎和我一样邪恶)。它接受整数的地址并将其取消引用,就像它是浮点数的地址一样。这也违反了别名规则,因此未定义的行为

后者将整数转换为保留信息的浮点数:

(float)42 == 42.0 // approximately, due to floating point precision errors

我写了an example,证明两者不相等。

答案 1 :(得分:3)

那些做非常不同的事情。第一个示例将整数中提供的位模式(“表示”)解释为float的位模式。第二个示例将整数的表示数字(“值”)转换为具有最接近的等效值的浮点数。

http://ideone.com/As73ZB

#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)

据我了解,第一个采用原始整数值并将其视为浮点数并将其返回。第二个取整数并将其转换为最接近的等效浮点值并返回它。