我想重新解釋一個unsigned long
(實際上,DWORD
)作爲signed long
。我嘗試過:如何在C++中將無符號長整型(DWORD)重新解釋爲有符號長整型?
DWORD x;
long y = reinterpret_cast<signed long>(x);
但是,VC++ 2010 intellisense告訴我「無效的類型轉換」。爲什麼?我如何解決它?
我想重新解釋一個unsigned long
(實際上,DWORD
)作爲signed long
。我嘗試過:如何在C++中將無符號長整型(DWORD)重新解釋爲有符號長整型?
DWORD x;
long y = reinterpret_cast<signed long>(x);
但是,VC++ 2010 intellisense告訴我「無效的類型轉換」。爲什麼?我如何解決它?
請嘗試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風格轉換沒有類似的向後兼容性警告。
*你是什麼意思*「過分寬容」*? – 2011-07-16 14:54:50
編輯我的答案,包括該信息。 –
你的第二段中有輕微的錯誤,你說(改變是?)它只是失敗。 – 2011-07-16 19:35:31
你不需要reinterpret_cast
將無符號類型轉換爲有符號的類型,static_cast
會做。
是爲什麼它說無效類型轉換? – 2011-07-15 15:26:48
@ 0A0D:可能,是的。這在GCC中也是一個錯誤。 –
@ 0A0D:標準顯式地命名您可以使用'reinterpret_cast',整型類型不是該列表的一部分。 –
另請參閱: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