如何将无符号长整数(DWORD)重新解释为C ++中的带符号长整数?

时间:2011-07-15 15:22:07

标签: c++ reinterpret-cast unsigned-integer

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

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

然而,VC ++ 2010 intellisense告诉我“无效的类型转换”。为什么?我该如何解决?

2 个答案:

答案 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样式强制转换没有类似的警告,以便向后兼容。