• ベストアンサー

int型とfloat型の演算結果

C初心者です。 int型とfloat型で割り算をして処理を表示させてます。 以下、実処理の一部です。 int a; int b; a = 3; b = 2; (1) printf("答え=%d:1のはず\n",a/b); (2) printf("答え=%d:1のはず\n",a/(float)b); (3) printf("答え=%d:1のはず\n",(float)a/b); (4) printf("答え=%d:1のはず\n",(float)a/(float)b); 私の予想では(1)~(4)まですべて1が表示されると思っていました。 実際は(1)のみ1で(2)~(4)は0でした。 (2)~(4)はなぜ0と表示されるのですか? ・整数型と実数型で演算した場合、実数型に合わせられてること ・表示が整数型であること なので1が表示されると予想したのですが・・・。

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

  • ベストアンサー
  • gatyan
  • ベストアンサー率41% (160/385)
回答No.4

結論を先に言えば、偶然です(x86系だと、多分、0になる処理系が多いはず) b=11 とかに変えると・・・ メモリ上で変数がどのように格納されるのかとか、intのビット数や浮動小数点の扱いで結果は変わるはずです 演算は、より大きな桁数を扱える方の型になるので、 (1)はint (2)-(4)はfloat になって、printfは、%dから、引数をintとして処理しますが、intにあたる部分の値が偶然0になっていたため、全て0になったはず デバッガなどでメモリのダンプなどするといいかも

bad_star
質問者

お礼

デバッグしてみるとメモリ上の格納のされ方が違っていました。 納得できました。ありがとうございます。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

(2)~(4)の計算結果は、すべてfloat型です。 それを、"%d"という、int型用の書式文字列で 出力しようとしている点に問題があります。

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

浮動小数型って知っていますか? 整数型の1と浮動小数型の1とはメモリの持ち方が違うのです。浮動小数型float型の場合、32ビットあるうち整数値と指数値とに分けられていて、整数値に1、指数値に10の0乗の0を入れるのです。 提示された式は、intからfloatへ直接整数値指数値関係なく上書きされているのでは? つまりはキャスト変換がうまくいってないのですね。 思いつくのはそんなところです。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

%dだからでしょう。計算結果を(int)するか %fにするかだと思います。

関連するQ&A