5

我想将 a unsigned long(实际上是 a DWORD)重新解释为 a signed long。我试过:

DWORD x;
long y = reinterpret_cast<signed long>(x);

但是,VC++2010 intellisense 告诉我“类型转换无效”。为什么?我如何解决它?

4

2 回答 2

9

您不需要reinterpret_cast将无符号类型转换为有符号类型,static_cast就可以了。

于 2011-07-15T15:23:47.847 回答
8

尝试使用 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 样式转换没有类似的向后兼容性警告。

于 2011-07-15T15:24:13.617 回答