如何在C++中将无符号长整型(DWORD)重新解释为有符号长整型?

5

我希望将一个unsigned long(实际上是一个DWORD)重新解释为一个signed long。我尝试过:

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

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

请参见以下内容:https://dev59.com/ZnE95IYBdhLWcg3wrP6w 和 https://dev59.com/Zm855IYBdhLWcg3wNhZ1。 - user195488
2个回答

9
您不需要使用 reinterpret_cast 来将无符号类型转换为有符号类型,static_cast 就可以实现。

1
这就是为什么它显示无效类型转换的原因吗? - user195488
3
标准明确规定了可以使用reinterpret_cast的类型,将整数类型转换为另一种整数类型不在该列表中。 - Cat Plus Plus
重新审视一下,你可以将short强制转换成int,那为什么这样做是可以的,而把unsigned long转换成signed long就不行呢?这是因为它是long-to-long,而不是像long-to-int那样吗? - user195488
@0A0D:我真的不知道。你应该问一些更熟悉标准的人。 - Cat Plus Plus

8
尝试使用 static_cast 替代。如果您尝试使用过度宽松的转换(例如在 static_cast 或 const_cast 可以使用的情况下使用 reinterpret_cast),VC 会生成错误。
C++ 中有 5 种类型的转换,每种都允许您执行更多操作(授予更多权限)。最不具惯性的转换是 const 转换(const_cast<int>(<const int>)),它允许您更改 const 修饰符。还有 static_cast (static_cast<int>)(<short>),它允许您执行类型安全的强制转换(例如将基类转换为派生类)。还有动态转换 (dynamic_cast<derived_type>(base_type)),它允许您在两种类型之间进行转换,前提是这两种类型之间存在合法的转换(如果没有转换,则返回 null)。最后,还有一些转换可以在不相关的类型之间进行转换 - reinterpret_cast reinterpret_cast<int>(<void *>) 和 C 样式转换 (int)<void *>
我没有一个好的方法来描述这些不同类型的转换,因此我将它们描述为“更具惯性”,因为它们每个都允许您执行更多操作。
如果您使用 reinterpret_cast 而另一种转换类型更适合实现您的目标,VC 会发出警告。C 样式转换由于向后兼容性而没有类似的警告提示。

你所说的“过度宽松”是什么意思? - user195488
你的第二段有一点小错误,你说(将a改为?),但是它没有完整表达出来。 - user195488
好的解释,不要太长而痛苦。谢谢。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接