4

和有什么区别

int i = 123;
int k;
k = *(int *) &i;
cout << k << endl; //Output: 123

int i = 123;
int k;
k = i;
cout << k << endl; //Output: 123

它们都给出相同的输出,但有什么区别吗?

(我在快速反平方根的 Quake3 代码中找到了第一个片段)

4

3 回答 3

6

在第三季度:

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking
    i  = 0x5f3759df - ( i >> 1 );               // what the fuck?
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//  y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

    return y;
}

据我了解,您对以下行感兴趣:

    i  = * ( long * ) &y;

y一个float,并且i是一个long。因此,它是将浮点位模式重新解释为整数位模式。

于 2013-05-20T08:23:27.800 回答
2

这完全取决于i是对象还是原始类型。如果它是一个对象,operator*可能会被重载,给出不同的整体含义。

于 2013-05-20T08:19:51.307 回答
1

不,没有区别,这两个分配本质上都是将 aint的位从内存存储复制i到内存存储k

当源变量和目标变量的类型不同时,有时会使用类似的技巧,但这int对于int.

我认为,一个足够聪明的编译器应该为两个版本生成完全相同的代码。

于 2013-05-20T08:17:40.387 回答