我想将 a unsigned long
(实际上是 a DWORD
)重新解释为 a signed long
。我试过:
DWORD x;
long y = reinterpret_cast<signed long>(x);
但是,VC++2010 intellisense 告诉我“类型转换无效”。为什么?我如何解决它?
我想将 a unsigned long
(实际上是 a DWORD
)重新解释为 a signed long
。我试过:
DWORD x;
long y = reinterpret_cast<signed long>(x);
但是,VC++2010 intellisense 告诉我“类型转换无效”。为什么?我如何解决它?
您不需要reinterpret_cast
将无符号类型转换为有符号类型,static_cast
就可以了。
尝试使用 static_cast 代替。如果您尝试过度宽松的强制转换(例如在 static_cast 或 const_cast 就足够时使用 reinterpret_cast),VC 会生成错误。
C++ 中有 5 种类型的强制转换,每一种都可以让您做更多事情(授予更多权限)。最不宽松的强制转换是 const casts ( const_cast<int>(<const int>)
),它允许您更改 const 修饰符。有静态强制转换 ( static_cast<int>)(<short>)
) 允许您执行类型安全强制转换(例如,将基转换为派生)。还有动态转换(如果两者之间存在合法转换,则dynamic_cast<derived_type>(base_type)
允许您从一种类型转换为另一种类型(并且如果没有转换,则返回 null。最后,还有允许在不相关类型之间进行转换的转换 - reinterpret_cast和 C 样式转换。reinterpret_cast<int>(<void *>)
(int)<void *>
我没有很好的方式来描述这些不同类型的演员表,所以我将它们描述为“更宽容”,因为它们中的每一个都可以让你做更多的事情。
如果您正在使用重新解释转换,VC 会警告您,而其他转换类型中的一种更适合实现您的目标。C 样式转换没有类似的向后兼容性警告。