2011-07-15 86 views
3

我想重新解釋一個unsigned long(實際上,DWORD)作爲signed long。我嘗試過:如何在C++中將無符號長整型(DWORD)重新解釋爲有符號長整型?

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

但是,VC++ 2010 intellisense告訴我「無效的類型轉換」。爲什麼?我如何解決它?

+0

另請參閱:http://stackoverflow.com/questions/2205353/why-doesnt-this-reinterpret-cast-compile和http://stackoverflow.com/questions/4476182/which-cast-to-use- static-cast-or-reinterpret-cast – 2011-07-16 21:09:14

回答

7

請嘗試static_cast。如果你嘗試過度的寬容轉換(比如在static_cast或const_cast足夠時使用reinterpret_cast),VC會產生一個錯誤。

在C++中有5種類型的強制類型,每個類型允許您執行更多操作(授予更多的權限)。最不受限制的強制轉換是const強制轉換(const_cast<int>(<const int>)),它允許您更改const修飾符。有靜態演職員表(static_cast<int>)(<short>))可以讓你執行類型安全角色(例如演員基礎派生)。有動態演員陣容(dynamic_cast<derived_type>(base_type))允許你從一種類型投射到另一種如果之間存在合法的轉換兩個(如果沒有轉換是返回NULL)最後,有管型,讓不相關的類型之間的轉換 - 的reinterpret_cast reinterpret_cast<int>(<void *>)和C風格的投(int)<void *>

我沒有描述這些不同的好方法。所以我將它們描述爲「更寬容」,因爲它們中的每一個都允許您做更多。

如果您正在使用reinterp,VC會向您發出警告當其他演員類型之一更適合實現你的目標時施放。 C風格轉換沒有類似的向後兼容性警告。

+0

*你是什麼意思*「過分寬容」*? – 2011-07-16 14:54:50

+0

編輯我的答案,包括該信息。 –

+0

你的第二段中有輕微的錯誤,你說(改變是?)它只是失敗。 – 2011-07-16 19:35:31

8

你不需要reinterpret_cast將無符號類型轉換爲有符號的類型,static_cast會做。

+1

是爲什麼它說無效類型轉換? – 2011-07-15 15:26:48

+0

@ 0A0D:可能,是的。這在GCC中也是一個錯誤。 –

+3

@ 0A0D:標準顯式地命名您可以使用'reinterpret_cast',整型類型不是該列表的一部分。 –

相關問題