1

最近我遇到了一段代码,它使用了一种我觉得很奇怪的转换方式。这里也有例子:

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

3 回答 3

9

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

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

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

我写了一个例子来证明两者是不相等的。

于 2013-06-14T23:21:19.563 回答
3

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

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;
}
于 2013-06-14T23:20:54.657 回答
1

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

于 2013-06-14T23:21:01.797 回答