2016-05-12 6 views
2

が、私は次のプログラムを書いた(&I):しかしはなぜこのエラーです:static_castを<unsigned*>他のすべての前<code>static_cast</code>または<code>dynamic_cast</code>を好むように親指のルールに従うことにより

int main(void) 
{ 
    int i = 0; 
    unsigned *j = static_cast<unsigned*>(&i); 
    return 0; 
} 

を、それもコンパイルされません。

$ g++ --std=c++11 test5.cpp 
test5.cpp: In function ‘int main()’: 
test5.cpp:4:44: error: invalid static_cast from type ‘int*’ to type ‘unsigned int*’ 
    unsigned *j = static_cast<unsigned*>(&i); 
              ^

なぜ間違っていますか?この状況の正しいキャストは何ですか?

+2

これには 'reinterpret_cast'が必要です。 – kennytm

+0

これは 'dynamic_cast'でもコンパイルされませんでした。そのため、前提全体がちょっと欺かれています。 –

+0

@kennytm、これは私が避けようとしているものです。 'reinterpret_cast'と'(unsigned *) 'は悪いので、最後の手段としてのみ使うようにしています。私はそんなに簡単な仕事のためにそれらが必要であるとは思っていませんでした。 – Vorac

答えて

7

static_castintからunsignedまで適切な変換を実行できます。しかし、あなたが持っているのはポインタです。このポインタは、intと解釈されるメモリの領域を指し示します。ポインタを参照解除すると、intの値が返されます。 static_cast will not convert between pointers to unrelated types。逆参照の下unsignedとしてのメモリを処理するために

int i = 0; 
int* ip = &i; 
int j = *ip; // treat the region pointed to as an int 

、あなたはメモリを再解釈する必要があります。それはreinterpret_castのことです。

int i = 0; 
int* ip = &i; 
unsigned j = *reinterpret_cast<unsigned*>(ip); // treat the region pointed to as unsigned 

ただし、これを行うべきではありません。 reinterpret_castはそれが言うことを正確に行います。メモリを別のタイプとして再解釈します。ビットパターンがそのタイプに予想されるものと一致しない場合、結果はstatic_cast<unsigned>によって実行される変換とは異なります。これは、符号付き整数が2の補数を使用して表されていないシステムの場合に当てはまります。異なるようstatic_cast整数変換を実行する、それは再解釈されませんメモリ領域:

int i = 0; 
int* ip = &i; 
unsigned j = static_cast<unsigned>(*ip); // treat the region pointed to as int 
             // then convert the int to unsigned 

要約する:その結果はstatic_cast<unsigned>

正しいアプローチは、その後int*間接参照でありますタイプ。それはreinterpret_castのためです。

2

あなたが使用する必要があります:

unsigned *j = static_cast<unsigned*>(static_cast<void*>(&i)); 

これはあなたがポイント5でhereを読むことができるものであるか、または単に使用:reinterpret_cast

int i = 0; 
unsigned *j = reinterpret_cast<unsigned*>(&i); 

しばしば代わりのプログラマが使うキャスト-Sを使用して

union { 
    int n; 
    unsigned char bt[4]; 
} data; 
data.n = i; 
data.bt[3] = 0xff; 

コメントで述べたように、uniほとんどのコンパイラでサポートされていても、未定義の振る舞いです。ここで詳しく読むことができます:Is using an union in place of a cast well defined?とここにはIs using an union in place of a cast well defined?

+2

C++ではunionのバージョンが未定義の動作です –

関連する問題

 関連する問題