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;