電子書籍の厳選無料作品が豊富!

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が表示されると予想したのですが・・・。

A 回答 (4件)

結論を先に言えば、偶然です(x86系だと、多分、0になる処理系が多いはず)


b=11
とかに変えると・・・

メモリ上で変数がどのように格納されるのかとか、intのビット数や浮動小数点の扱いで結果は変わるはずです

演算は、より大きな桁数を扱える方の型になるので、
(1)はint
(2)-(4)はfloat
になって、printfは、%dから、引数をintとして処理しますが、intにあたる部分の値が偶然0になっていたため、全て0になったはず
デバッガなどでメモリのダンプなどするといいかも
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/29 20:51

(2)~(4)の計算結果は、すべてfloat型です。


それを、"%d"という、int型用の書式文字列で
出力しようとしている点に問題があります。
    • good
    • 0

浮動小数型って知っていますか?


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

思いつくのはそんなところです。
    • good
    • 0

%dだからでしょう。

計算結果を(int)するか
%fにするかだと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!