• ベストアンサー

C言語での変数の書式設定

こんばんは。 このたびC言語を学びはじめたのですが、変数の書式設定の部分で分からない部分があったので、質問させていただきました。 分からない部分というのは%ld,%hd,(%lf)(%hf)です。(()内に書いたのは存在するか分かりませんが・・・。) これらはshortやlongで整数(実数)を表現する書式だと書いてあったのですが、具体的に何がどう違うのかがよくわかりません。 ためしにlong型で宣言した変数を%hdで表示してみたらshort型で表現できる数のみしか正常に表示されませんでした。しかし、short型で宣言した変数を%ldで表示してみても何も変化が見られません。また、実数に関してはよくわからない値が返ってきてしまいました。 変数で宣言した型と実際に使う書式が合致するか否かでは一体何がどう変化するのでしょうか? 初歩的なことかもしれませんが、以上の疑問の答えを知っていらっしゃる方がいましたら、どうかご教授ください。お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

printf()で使うそのような指定は、 「printfが、データを何個使うか」を指定しています。 たとえばprintf("%d %ld %d", a, b, c)のようにしたとき、 printfの外部と内部では、「何型の変数が何個渡されたか」の 情報が通じていません。 printf内部では、変数a, b, cが何型なのかわからないわけです。 バイトレベルでごっちゃになってprintfに送られてきます。 仮に、short型が2バイト、int型が4バイト、long型が8バイトの処理系だとしましょう。 %dは、普通はint型を処理します。 だから、ごっちゃになったデータの先頭から4バイトを取って、後は残します。 次の%ldは、データから8バイト取ります。 次の%dはデータから4バイト取ります。 で、%ldと%dをまちがえて書くとどうなるかというと、 あとの表示がぐちゃぐちゃになるのです。 (これは私も、何度も痛い目に遭いました) %ldでint型を処理すると、それ自体は普通に処理できるかもしれませんが、 4つでいいところを8つ取っているため、後ろがずれて大変なことになります。 もっとも、intとlongの大きさが同じ環境だと、 問題なく動いてしまうこともあります。 shortの場合はもう少し違う問題があります。 printfへ送られる際、shortやchar型などの小さい型の変数は、 「あんまり小さいんで取り扱いが面倒だな。 悪いけどintにして送るよ」 となります。小さすぎる荷物を小包で送るとき詰め物をするような感じですね。 printfの中では、charもshortもint型と同様に取り扱います。 だからprintfで%hdを使うことは、ほとんどありません。 scanfの方はまた別で、 どの型の変数に変換するか正確にわかってないといけません。 だからshort型の場合にはhが必要です。

noname#15820
質問者

お礼

なるほど、内部ではそういったことが行われていたんですね。判らなかったなぞが少し解けたような気がします。もう少し自分でいろいろ試してみようと思います。 ありがとうございました!

その他の回答 (2)

noname#30727
noname#30727
回答No.2

可変引数関数の引数が int よりも小さい場合、int および unsigned int に自動型変換される処理系は多いです。long と int が同じ大きさである処理系も多いので、 printf("%d, %ld, %ld, %d\n", (short)100, (short)200, 300, 400L); としても問題ない事が多いです。しかし、本来ならば書式に従った引数を正しく渡すべきでしょう。 逆のパターンで printf("%c, %hd\n", 0xffffff41, 0xffff0001); このとき、char が 8ビット、short が 16ビットである処理系は多いので、その場合、%c は int を受け取っても、下位8ビットが有効なので 'A' を表示し、%hd は 下位16ビットが有効なので 1 を表示することになります。

noname#15820
質問者

お礼

元のビット数よりも取得ビット数が少ない場合は後ろから切り取るという形なんですね。そこら辺のことを踏まえてもう少し実験をしてみようと思います。ありがとうございました!

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

char型 short型 int型 long型 等は表現できる数値の範囲が異なります。 char型 1バイト -127~127 short型 int型 2バイト -32767~32767 long型 4バイト -2147483647~2147483647 というのが一般的です。 では、%ldや%hdについてですが、 %ldはlong型の変数を表示出来るものです。 但し、long型より小さいサイズのshort型、int型、char型の数値を十分表現できるのです。 %hdはshort型の変数を表示出来るものです。 という事はlong型で表現出来るが、short型で表現出来ない値は%hdでは表現出来ないという事です。 お解り頂けましたでしょうか。

noname#15820
質問者

お礼

long型にshort型を使うと本来の値にはならないということなんですね。アドバイスありがとうございました。

関連するQ&A