- ベストアンサー
c言語 型変換について
c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
str[1] = 'B'; では、int型からchar型への型変換が発生します。 実行結果から、int型が4バイトであることがわかります。ただし、処理系不明ですので、1バイトが8ビットであるかどうか、文字コードがアスキーになるかどうかは断定できません。また、char型が符号付きか符号無しかも不明です。 これを踏まえた上で... > 規格上保証されているのは、符号付整数と > 符号なし整数間の型変換でしょうか 符号付き整数への型変換の場合、元が符号付きであろうが符号無しであろうが、値が変換後の型でも正しく表現できるのであれば何の問題もありません。そうでなければ、処理系定義の値になるか処理系定義のシグナルが発生します。 符号無し整数への型変換の場合、元の値が変換後の型の表現範囲を超えている場合、変換後の型の最大値+1を法とする剰余になることが規格上保証されています。 今回の場合、変換後の型であるchar型が符号付きか符号無しかわかりませんが、'B'の値は1~SCHAR_MAXの範囲であることが規格上保証されていますので問題ないわけです。 この説明で分からないのであれば、処理系やコンパイルオプションなど、必要な情報を補足してください。一般論ではなく、質問者さんの環境に特化した説明をするようにします。
その他の回答 (6)
- asuncion
- ベストアンサー率33% (2127/6289)
>#5さん >なので、実行結果が >>size B 4 >>size str[1] 1 >と言う状態になるのは当たり前。 sizeof('B')が4(これ以外の結果になる処理系あり)に、 sizeof(str[1])が1に、それぞれなるのは、 「なので」の前に書いてある内容をすべて省いても成り立ちますね。 というわけで、「なので」は「一方」とか「他方」とか書いた方が 論理的な感じがします。
お礼
回答ありがとうございます。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>str[0] = 'A'; /* 代入 */ >str[1] = 'B'; /* 代入 */ ここでは「格下げ」も起きないし、「型変換」も起きない。そんなことは無関係。 ただ単に「代入」が起きるだけ。 'A'は「intの値」なので(intが32ビットだとすると)2進数で00000000000000000000000001000001になる。 言い換えれば「32ビット(4バイト)の容器に入った定数」と言える。 char str[1]は「char」なので「容器は8ビット(1バイト)分」しかない。 大きさが「32ビット(4バイト)」の 00000000000000000000000001000001 を「8ビット(1バイト)の容器に突っ込む」と、下位8ビット(1バイト)の 01000001 だけが代入される。上位の余った24ビット(3バイト)は捨てられてどっか行っちゃう。 今回は「余って捨てられた、上位24ビット(上位3バイト)が全部0」だったから「偶然、ちゃんと値が格納されたように見える」けど、実際はすべての情報を格納し切れず「上位24ビット(上位3バイト)が余って捨てられている」のです。 なので、実行結果が >size B 4 >size str[1] 1 と言う状態になるのは当たり前。
お礼
回答ありがとうございます、容器の話で参考になりました。
- asuncion
- ベストアンサー率33% (2127/6289)
>代入の規則は、符号付き整数と符号なし整数間の型 >変換の場合、unsigned int 型 → unsigned char型の int型=char型でしょうか そういうルールに関することは、いったん脇へ置きましょう。 'B'はint型で、なおかつchar型で扱える範囲にある、ということは理解できますか?
お礼
回答ありがとうございます、理解できます。
- jacta
- ベストアンサー率26% (845/3158)
> 型の大きさが、int型4バイトで、char型1バイトなので大きさが小さいなるので > 正常に表示出来ないでないか 外国の方でしょうか?(日本語があまり得意でないなら、なるべく簡単な表現にするよう配慮します) int型からchar型に型変換する場合でも、元の値がchar型で表現できる範囲であれば何の問題もありません。基本実行文字集合('B'もそうです)はchar型で表現可能な正の値であることが規格上保証されていますので、何ら問題なく変換できます。 なお、正常に表示できるかどうかは、表示の処理次第ですのでここでは何ともいえません。
お礼
回答ありがとうございます、規格上保証されているのは、符号付整数と 符号なし整数間の型変換でしょうか
- asuncion
- ベストアンサー率33% (2127/6289)
'B'という、(たまたまchar型の範囲に収まる)int型の値を char型に代入しているだけのことです。 格下げとかいう話ではありません。
お礼
回答ありがとうございます。代入の規則は、符号付き整数と符号なし整数間の型 変換の場合、unsigned int 型 → unsigned char型の int型=char型でしょうか
- jacta
- ベストアンサー率26% (845/3158)
> 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) > 格下げする型変換する規則を教えてください。 'B'の型はint型ですし、str[1]の型はchar型です。 なにか根本的なところで勘違いがあるように思います。
お礼
回答ありがとうございます、'B'の型はint型ですし、str[1]の型はchar型ですが、 型の大きさが、int型4バイトで、char型1バイトなので大きさが小さいなるので 正常に表示出来ないでないか
お礼
回答ありがとうございます。Bの値が1~SCHAR_MAXの範囲なのでcharで表現可能なので型変換の規則「汎整数型をもつ値を他の汎整数型に変換する場合、その値が新しい型で表現可能ならば、値は変化しない」に該当すると解釈したいと思います。