'*(<type> *)&amp; x'和'x'之间有什么区别?</type>

时间:2013-05-20 08:13:50

标签: c++ pointers casting memory-address

之间有什么区别
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

它们都提供相同的输出但是有什么不同吗?

(我在Fast Inverse Square Root的Quake3代码中找到了第一个片段)

3 个答案:

答案 0 :(得分:7)

在第三季度:

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;

yfloatilong。因此,浮点位模式的重新解释为整数位模式。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

不,没有区别,两个分配基本上都是将int的值从存储i的内存复制到存储k的内存。

当源和目标变量的类型不同时,有时会使用这些技巧,但这只是intint

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