私はこの種のキャストと非常に混同しています。誰かがこの文で何が起こっているのか正確に説明できますか?ポインタとC/C++でのキャスト
x = *(char*)&n;
これは完全なコードであり、マシンがリトルエンディアンかビッグエンディアンかを知るために使用されます。
int n = 0x1234567;
char x;
x = *(char*)&n;
私はこの種のキャストと非常に混同しています。誰かがこの文で何が起こっているのか正確に説明できますか?ポインタとC/C++でのキャスト
x = *(char*)&n;
これは完全なコードであり、マシンがリトルエンディアンかビッグエンディアンかを知るために使用されます。
int n = 0x1234567;
char x;
x = *(char*)&n;
&n
n
のアドレスがかかりますが、決定的に、それはn
の最下位アドレスバイトです。 (char *)
は、そのアドレスをchar
へのポインタ、すなわち単一バイトへのポインタとして扱うようにコンパイラに指示する。 *
はそれを参照し、すなわち、そのアドレスに格納されたバイト値を取得する。
したがって、x
は、n
の最下位アドレスバイトに格納された値に設定されています。
&n
は、整数のアドレスであるn
のアドレスをとります。
(char*)(&n)
は、この情報をchar
のアドレスとして再解釈します。
*(char*)(&n)
は、このアドレスを逆参照します。つまり、そのアドレスにあるchar
の値です。換言すれば、それは整数n
の表現の最初のバイトの値です。
ここで、0x01
か0x67
かどうかを確認して、整数の格納方法を判断できます。
補足:有効なアドレスをcharのアドレスとして再解釈し、CとC++の両方で常に検査することができます。この方法で取得するダムバイトのストリームだけを入出力することができます(つまり、T x;
をchar[sizeof(T)]
として扱い、(char*)&x
経由でアクセスすることができます)ので、入出力を実行する必要があるときはいつでも必要です。あなたは、このコードは32ビットを使用し、ビッグエンディアン環境では環境...の「エンディアン」を検出するために使用することができる理由を視覚化する支援するため
あなたは、任意のアドレスを 'char * 'として解釈することは合法だと言いました。 'char * 'として解釈された' T'へのポインタを逆参照することも合法でしょうか?すなわち、 'T x; char c = *(char *)&x; '常に合法? –
@SethCarnegie:はい、すべてのオブジェクトのサイズが1以上です。 –
は数がこのバイトのために、メモリに格納されますint型
01 23 45 67
リトルエンディアン環境で
それはあなたが強制的にchar
ポインタに初期化intにint
ポインタをキャストした場合は、char型のポインタがint aの最初のバイトにdeferencedされます。このため
67 45 23 01
になりますそれはメモリに保存されます。
ビッグエンディアン環境では、これは01
になり、リトルエンディアン環境では67
になります。
intが32ビットでない場合、異なる値が得られます。
... OPの例ではエンディアンに応じて '0x67'または' 0x01'になります。 –
@Oli Charlesworthご協力いただきありがとうございます。だから、 'x =(char)n;' – Manolete
@Manolete - 'x'はあなたがそうするならば、常に' 0x67'になります。 –