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

use*_*080 1 c++ casting

最近我遇到了一段使用铸造方式的代码,我觉得很奇怪.这里也是例子:

inline float asfloat(unsigned int x){
    return *(float *) &x;
}

inline float asfloat(int x){
    return *(float *) &x;
}
Run Code Online (Sandbox Code Playgroud)

这种方式有什么优势吗?以下"更简单"的代码不会这样做吗?

inline float asfloat(unsigned int x){
    return (float)x;
}

inline float asfloat(int x){
    return (float)x;
}
Run Code Online (Sandbox Code Playgroud)

小智 9

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

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

(float)42 == 42.0 // approximately, due to floating point precision errors
Run Code Online (Sandbox Code Playgroud)

我写了一个例子,证明两者不相等.