我知道 C++ 中的reinterpret_cast可以这样使用:
float a = 0;
int b = *reinterpret_cast<int*>(&a);
但是为什么不能直接施法呢?
float a = 0;
int b = reinterpret_cast<int>(a);
error: invalid cast from type 'float' to type 'int'
我知道 C++ 中的reinterpret_cast可以这样使用:
float a = 0;
int b = *reinterpret_cast<int*>(&a);
但是为什么不能直接施法呢?
float a = 0;
int b = reinterpret_cast<int>(a);
error: invalid cast from type 'float' to type 'int'
reinterpret_cast
所做的只是让您以不同的方式读取您传递的内存。你给它一个内存位置,并要求它读取该内存,就好像它是你要求它读的一样。这就是为什么它只能与指针和引用一起使用。
我们以这段代码为例:
#include <iostream>
int main()
{
float a = 12;
int b = *reinterpret_cast<int*>(&a);
std::cout << b;
}
因此,要将这行代码分解为更多细节*reinterpret_cast<int*>(&a);
:
a
reinterpret_cast
对一个int*
int*
指向a
int
现在,当我运行它时,我得到1094713344
了 12 的原因,因为float
使用 IEEE 表示为0100 0001 0100 0000 0000 0000 0000 0000
二进制。现在把那个二进制文件读为unsigned int
,然后你最终得到1094713344
.
这就是为什么reinterpret_cast
被认为是非常危险的,为什么不应该在这种情况下使用它。
只有当您有一个指向内存的指针并且您需要以某种方式读取该内存并且您知道可以以这种方式读取内存时,您才应该使用它。
在您给出的情况下,您不能 reinterpret_cast ,因为 reinterpret_cast 只需要一个 int 来转换为指针,或者相反,并遵循其他类似的规则。
那里有这些规则的摘要:http: //en.cppreference.com/w/cpp/language/reinterpret_cast
在第二种情况下,它不是从值a
转换为b
。事实上,这只是一种转换。b
不会指向x
并假装它指向一个浮点数。Conversion 构造一个 int 类型的新值,并将其赋值为 from a
。
有几种方法可以在 C++ 中正确地进行这种转换。
一种是像往常一样简单地使用静态转换。这是推荐的解决方案:
int b = static_cast<int>(a);
您可以通过以下方式使用 reinterpret_cast。请注意,这是对位模式的重新解释,而不是与提到的替代方案不同的转换:
int b = reinterpret_cast<int&>(a);
您还可以使用 C 样式转换:
int b = (int)a;
您还可以使用 C++ 函数样式转换:
int b = int(a);
您也可以获得隐式对话,尽管它可能会产生警告:
int b = a;
在这种特殊情况下建议使用静态转换,但至少不要使用隐式对话,也不要使用 C++ 中的 C 样式。
您可以将reinterpret_cast
指针类型转换为任何其他指针类型,例如,您可以将float
指针转换为int
指针:
float *a = new int(0);
int* b = reinterpret_cast<int*>(a);