C++ '*(<;type>;*)&;x';和';x';?

C++ '*(<;type>;*)&;x';和';x';?,c++,pointers,casting,memory-address,C++,Pointers,Casting,Memory Address,两者的区别是什么 int i = 123; int k; k = *(int *) &i; cout << k << endl; //Output: 123 inti=123; int k; k=*(int*)&i; cout不,没有区别,这两种赋值基本上都是将int值的位从存储i的内存复制到存储k的内存 当源变量和目标变量的类型不同时,有时会使用类似的技巧,但这只是简单的int到int 我认为,一个足够聪明的编译器应该为两个版本生成完全相同的代码。这完全取决于

两者的区别是什么

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

cout不,没有区别,这两种赋值基本上都是将
int
值的位从存储
i
的内存复制到存储
k
的内存

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


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

这完全取决于
I
是对象还是基本类型。如果它是一个对象,
操作符*
可能会被重载,从而给出不同的总体含义。

在第三季度:

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
。因此,它将浮点位模式重新解释为整数位模式。

您确定这与您看到的代码片段等效吗?最有可能的情况是将一种类型的指针转换为另一种类型。在快速反向sqrt代码段中,与此类似的任何其他实例(不包括cargo cult——令人沮丧的是必须添加这一点)中,
i
k
的类型不同。我打赌第一个代码段不是这样的,但
float i=1.23或类似的东西,在这种情况下,它是一个“类型双关转换”——将一种类型转换为另一种类型。在C++中,最好使用<代码> RealTytCase<代码>。如果你仔细检查代码,你会发现Q3算法中的<代码> I/C++ >类型为长。但是它被转换成<代码>浮点,所以不完全相同。注意,我删除了<代码> C<代码>代码>,因为这个代码是C++。C中的类型转换行为与C++中的行为不同。代码的算法在Wiki中看起来是@ UsR1。它被提到是从Q3源获取的。@ USE2400 925,因为如果你做了代码> i=(long)y;code>您将把
float
转换为
long
并修改位模式,因为
y
的值将被舍入到最接近的整数。在“i= *(long *)和y”的情况下,位模式保持不变。根据,你应该是代码> RealTytCase[i,/Cuth]或< Cuth>(RealTytCase:[/i)] /C> >我在 C++ +/Cuff>中不好,所以可能有点错误。C++中的类型双关是通过引用引用来完成的。示例中两个强制转换的等价物是
i=reinterpret\u cast(y)
y=重新解释铸件(i)。(参见5.2.10[expr.reinterpret.cast]p11),那么为什么这段代码的作者写了i=*(long*)&y;而不是i=(长)y?
    i  = * ( long * ) &y;