久しぶりにCを書いていたら、キャストでハマりました。int => charへのキャストとint * => char * へのキャストの違いについて教えてください。


int a = 0x12345678;
unsigned char ac = (unsigned char) a;

int i = 0x12345678;
unsigned char * ic = (unsigned char *)&i;

この2つの違いです。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2007/04/25 02:07:56
  • 終了:2007/04/25 04:43:39

ベストアンサー

id:studioes No.2

studioes回答回数522ベストアンサー獲得回数612007/04/25 04:28:02

ポイント35pt

>(int)a を unsigner char にキャストした時点で a の領域は、もしintが4byteであれば、後方3byteは削られてしまう(可能性がある)のでしょうか。

aの領域は無関係。 acにはaの8ビットだけが入ってくる。 キャストは、変換しているわけではなく、その型であるとみなしているだけ。

>一方後者の方では ic の指す領域は4byteのまま保たれているのか

 ポインタを扱っている以上、ポインタはただ先頭を指し示すのみ。 icを読めば、charの範囲しか読まないけど、icを(int*)icとして読めば元通りintの範囲が読める。

http://q.hatena.ne.jp/

id:tono5652

あ、そうか。目が覚めました。ありがとうございます。

2007/04/25 04:43:23

その他の回答(1件)

id:studioes No.1

studioes回答回数522ベストアンサー獲得回数612007/04/25 03:29:41

ポイント35pt

unsigned char ac = (unsigned char) a;

acにaの値をunsigned char型の値として入れる。

unsigned char * ic = (unsigned char *)&i;

ポインタicに、iのポインタをunsigned char型へのポインタとして入れる。

http://q.hatena.ne.jp/

id:tono5652

それは分かっているつもりです。

(int)a を unsigner char にキャストした時点で a の領域は、もしintが4byteであれば、後方3byteは削られてしまう(可能性がある)のでしょうか。

一方後者の方では ic の指す領域は4byteのまま保たれているのかなと。

そのようなことについてお聞きしたいと考えていました。質問の仕方が悪かったかもしれません。

2007/04/25 03:48:00
id:studioes No.2

studioes回答回数522ベストアンサー獲得回数612007/04/25 04:28:02ここでベストアンサー

ポイント35pt

>(int)a を unsigner char にキャストした時点で a の領域は、もしintが4byteであれば、後方3byteは削られてしまう(可能性がある)のでしょうか。

aの領域は無関係。 acにはaの8ビットだけが入ってくる。 キャストは、変換しているわけではなく、その型であるとみなしているだけ。

>一方後者の方では ic の指す領域は4byteのまま保たれているのか

 ポインタを扱っている以上、ポインタはただ先頭を指し示すのみ。 icを読めば、charの範囲しか読まないけど、icを(int*)icとして読めば元通りintの範囲が読める。

http://q.hatena.ne.jp/

id:tono5652

あ、そうか。目が覚めました。ありがとうございます。

2007/04/25 04:43:23
  • id:kurukuru-neko

    >int a = 0x12345678;
    >unsigned char ac = (unsigned char) a;

    intは、整数で32bitとした場合、
    =は代入演算でこの場合は、数値として
    整数がunsigned charとしてみなすが
    変換はされないが実際には、数値としての
    unsigned charに該当する0x78部分となる。
    キャストにより情報が失われている事になる。

    >int i = 0x12345678;
    >unsigned char * ic = (unsigned char *)&i;

    &i: iの保存されている領域のアドレス
    (unsigned char *)は、int *のアドレスを
    unsigned char *としてみなすだけ。
    *ic: 何らかのアドレスの位置を保存している

    変換前後で、アドレスを情報に変化はなく。
    言語上の属性として違いあるだけ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません