int a = 0x12345678;
unsigned char ac = (unsigned char) a;
int i = 0x12345678;
unsigned char * ic = (unsigned char *)&i;
この2つの違いです。
>(int)a を unsigner char にキャストした時点で a の領域は、もしintが4byteであれば、後方3byteは削られてしまう(可能性がある)のでしょうか。
aの領域は無関係。 acにはaの8ビットだけが入ってくる。 キャストは、変換しているわけではなく、その型であるとみなしているだけ。
>一方後者の方では ic の指す領域は4byteのまま保たれているのか
ポインタを扱っている以上、ポインタはただ先頭を指し示すのみ。 icを読めば、charの範囲しか読まないけど、icを(int*)icとして読めば元通りintの範囲が読める。
unsigned char ac = (unsigned char) a;
acにaの値をunsigned char型の値として入れる。
unsigned char * ic = (unsigned char *)&i;
ポインタicに、iのポインタをunsigned char型へのポインタとして入れる。
それは分かっているつもりです。
(int)a を unsigner char にキャストした時点で a の領域は、もしintが4byteであれば、後方3byteは削られてしまう(可能性がある)のでしょうか。
一方後者の方では ic の指す領域は4byteのまま保たれているのかなと。
そのようなことについてお聞きしたいと考えていました。質問の仕方が悪かったかもしれません。
>(int)a を unsigner char にキャストした時点で a の領域は、もしintが4byteであれば、後方3byteは削られてしまう(可能性がある)のでしょうか。
aの領域は無関係。 acにはaの8ビットだけが入ってくる。 キャストは、変換しているわけではなく、その型であるとみなしているだけ。
>一方後者の方では ic の指す領域は4byteのまま保たれているのか
ポインタを扱っている以上、ポインタはただ先頭を指し示すのみ。 icを読めば、charの範囲しか読まないけど、icを(int*)icとして読めば元通りintの範囲が読める。
あ、そうか。目が覚めました。ありがとうございます。
あ、そうか。目が覚めました。ありがとうございます。