我在倒车,然后发现了一个定义为COERCE_FLOAT:那是一个简单的转换方法,但是真的像在C ++中那样吗?我不明白。

评论

安装文件夹应具有一些带有宏,类型和常量声明的头文件。

#1 楼

我认为这只是一个简单的转换。

v29 = *reinterpret_cast< float* >( &v30 );

如果共享生成的程序集而不是伪代码,将会更容易。

#2 楼

就像WasserEsser所说的,这可能只是一个简单的转换。我在尝试反编译q_rsqrt函数时遇到了相同类型的转换。您可能像WasserEsser建议的那样通过使用强制转换来重新创建相同类型的行为,但是您也可能像下面的代码中那样使用联合:
然后反编译为:

float Q_rsqrt( float number )
{
    union {
        float f;
        uint32_t i;
    } conv;

    float x2;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    conv.f  = number;
    conv.i  = 0x5f3759df - ( conv.i >> 1 );
    conv.f  = conv.f * ( threehalfs - ( x2 * conv.f * conv.f ) );
    return conv.f;
}