我正在倒车,然后我找到了 COERCE_FLOAT 的定义:
float v28;
float v29;
v29 = COERCE_FLOAT(&v30);
v28 = COERCE_FLOAT(&v31); // what is this?
我搜索并 发现 它是一种简单的转换方法,但真的像在 C++ 中一样吗?
v30 的值在没有指针的情况下传递给 v29?我不明白。
我正在倒车,然后我找到了 COERCE_FLOAT 的定义:
float v28;
float v29;
v29 = COERCE_FLOAT(&v30);
v28 = COERCE_FLOAT(&v31); // what is this?
我搜索并 发现 它是一种简单的转换方法,但真的像在 C++ 中一样吗?
v30 的值在没有指针的情况下传递给 v29?我不明白。
我认为这只是一个简单的演员表。
v29 = *reinterpret_cast< float* >( &v30 );
如果您共享生成的程序集而不是伪代码会更容易。
这可能只是像 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;
}
然后反编译为:
float __stdcall Q_rsqrt(float a1)
{
return (flt1Point5
- a1
* flt0Point5
* COERCE_FLOAT(0x5F3759DF - (SLODWORD(a1) >> 1))
* COERCE_FLOAT(0x5F3759DF - (SLODWORD(a1) >> 1)))
* COERCE_FLOAT(0x5F3759DF - (SLODWORD(a1) >> 1));
}