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

Casting variables in C via dereferencing

本文关键字:转换 变量 引用      更新时间:2023-10-16

最近我遇到一段代码,它使用了一种我觉得很奇怪的类型转换方式。下面是两个例子:

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

前者执行位强制转换,这是邪恶(几乎和我一样邪恶)。它接受整型的地址,并将其解引用,就像它是浮点数的地址一样。这也违反了混叠规则,因此是未定义行为

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

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

我写了一个例子来说明这两个是不相等的

它们的作用非常不同。第一个例子将整数中提供的位模式("表示")解释为浮点数的位模式。第二个示例将整型的表示数("value")转换为具有最接近等价值的浮点数。

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

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