2011-07-15 3 views
3

unsigned long(実際にはDWORD)をsigned longと再解釈したいと思います。私は試みました:C++で符号なしlong(DWORD)をsigned longとして再解析するにはどうすればよいですか?

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

しかし、VC++ 2010 intellisenseは「無効な型変換」と言っています。どうして?どうすれば修正できますか?

+0

他を見る:http://stackoverflow.com/questions/2205353/why-doesnt-this-reinterpret-cast-compile and http://stackoverflow.com/questions/4476182/which-cast-to-use- static-cast-or-reinterpret-cast –

答えて

7

代わりにstatic_castを試してください。 VCは、過度に許容的なキャストを試みるとエラーを生成します(static_castまたはconst_castで十分な場合はreinterpret_castを使用するなど)。

C++には5種類のキャストがあり、それぞれがより多くのことを行うことができます(より多くの権限を与えます)。少なくとも許容できるキャストはconst修飾子を変更できるconstキャスト(const_cast<int>(<const int>))です。タイプキャスト(例えば、派生からベースへのキャスト)を実行できる静的キャスト(static_cast<int>)(<short>))があります。あるタイプから別のキャストにキャストできるdynamic_cast<derived_type>(base_type)があります。の間に法的な変換がある場合は最後に、無関係な型の変換を可能にするキャストがあります - reinterpret_cast reinterpret_cast<int>(<void *>)とCスタイルのキャスト(int)<void *>

私はこれらの異なった記述方法がありませんキャストの種類が異なるので、私はそれらのそれぞれがあなたにより多くのことを許可するので、それらを「より許容的」と記述します。

VCはあなたにreinterp他のキャストタイプの1つがあなたの目標を達成するのに適している場合は、再キャストしてください。 Cスタイルのキャストには下位互換性に関する同様の警告はありません。

+0

「過度に許容される」*とは何を意味しますか? –

+0

その情報を含めるために私の答えを編集しました。 –

+0

あなたが言う2番目の段落に少し間違いがあります。 –

8

reinterpret_cast符号なしタイプを符号付きのものに変換する必要はありません。static_castが行います。

+1

は、それが無効な型変換と言うのはなぜですか? –

+0

@ 0A0D:おそらく、そうです。 GCCでもエラーです。 –

+3

@ 0A0D:標準では、 'reinterpret_cast'をどのように使うことができるかを明示的に指定しています。整数型の整数型は、そのリストの一部ではありません。 –

関連する問題