2012-02-26 13 views
2

私はこの種のキャストと非常に混同しています。誰かがこの文で何が起こっているのか正確に説明できますか?ポインタとC/C++でのキャスト

x = *(char*)&n; 

これは完全なコードであり、マシンがリトルエンディアンかビッグエンディアンかを知るために使用されます。

int n = 0x1234567; 
char x; 
x = *(char*)&n; 

答えて

4

&nnのアドレスがかかりますが、決定的に、それはnの最下位アドレスバイトです。 (char *)は、そのアドレスをcharへのポインタ、すなわち単一バイトへのポインタとして扱うようにコンパイラに指示する。 *はそれを参照し、すなわち、そのアドレスに格納されたバイト値を取得する。

したがって、xは、nの最下位アドレスバイトに格納された値に設定されています。

+3

... OPの例ではエンディアンに応じて '0x67'または' 0x01'になります。 –

+0

@Oli Charlesworthご協力いただきありがとうございます。だから、 'x =(char)n;' – Manolete

+0

@Manolete - 'x'はあなたがそうするならば、常に' 0x67'になります。 –

4

&nは、整数のアドレスであるnのアドレスをとります。

(char*)(&n)は、この情報をcharのアドレスとして再解釈します。

*(char*)(&n)は、このアドレスを逆参照します。つまり、そのアドレスにあるcharの値です。換言すれば、それは整数nの表現の最初のバイトの値です。

ここで、0x010x67かどうかを確認して、整数の格納方法を判断できます。

補足:有効なアドレスをcharのアドレスとして再解釈し、CとC++の両方で常に検査することができます。この方法で取得するダムバイトのストリームだけを入出力することができます(つまり、T x;char[sizeof(T)]として扱い、(char*)&x経由でアクセスすることができます)ので、入出力を実行する必要があるときはいつでも必要です。あなたは、このコードは32ビットを使用し、ビッグエンディアン環境では環境...の「エンディアン」を検出するために使用することができる理由を視覚化する支援するため

+0

あなたは、任意のアドレスを 'char * 'として解釈することは合法だと言いました。 'char * 'として解釈された' T'へのポインタを逆参照することも合法でしょうか?すなわち、 'T x; char c = *(char *)&x; '常に合法? –

+0

@SethCarnegie:はい、すべてのオブジェクトのサイズが1以上です。 –

3

は数がこのバイトのために、メモリに格納されますint型

01 23 45 67 
リトルエンディアン環境で

それはあなたが強制的にcharポインタに初期化intにintポインタをキャストした場合は、char型のポインタがint aの最初のバイトにdeferencedされます。このため

67 45 23 01 

になりますそれはメモリに保存されます。

ビッグエンディアン環境では、これは01になり、リトルエンディアン環境では67になります。

intが32ビットでない場合、異なる値が得られます。

関連する問題