我想将unsigned long
(实际上是DWORD
)重新解释为signed long
。我试过了:
DWORD x;
long y = reinterpret_cast<signed long>(x);
然而,VC ++ 2010 intellisense告诉我“无效的类型转换”。为什么?我该如何解决?
答案 0 :(得分:8)
您无需reinterpret_cast
将无符号类型转换为已签名类型,static_cast
即可。
答案 1 :(得分:8)
尝试使用static_cast。如果您尝试过度宽松的强制转换,VC会生成错误(例如,当static_cast或const_cast足够时使用reinterpret_cast)。
C ++中有5种类型的强制转换,每种类型都允许您执行更多操作(授予更多权限)。最不宽容的强制转换是const强制转换(const_cast<int>(<const int>)
),允许您更改const修饰符。有静态强制转换(static_cast<int>)(<short>)
)允许你执行类型安全的版本(例如,派生基础派生)。有动态强制转换(dynamic_cast<derived_type>(base_type)
,允许你从一种类型转换为另一种类型< em> if 两者之间存在合法转换(如果没有转换则返回null)。最后,有一些转换允许在不相关的类型之间进行转换 - reinterpret_cast reinterpret_cast<int>(<void *>)
和C style cast { {1}}。
我没有很好的方法来描述这些不同类型的演员表,因此我将它们描述为“更宽松”,因为它们中的每一个都允许你做更多。
如果您使用其他演员类型更适合实现目标,VC会警告您使用重新解释演员表。 C样式强制转换没有类似的警告,以便向后兼容。