
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が表示されると予想したのですが・・・。
No.4ベストアンサー
- 回答日時:
結論を先に言えば、偶然です(x86系だと、多分、0になる処理系が多いはず)
b=11
とかに変えると・・・
メモリ上で変数がどのように格納されるのかとか、intのビット数や浮動小数点の扱いで結果は変わるはずです
演算は、より大きな桁数を扱える方の型になるので、
(1)はint
(2)-(4)はfloat
になって、printfは、%dから、引数をintとして処理しますが、intにあたる部分の値が偶然0になっていたため、全て0になったはず
デバッガなどでメモリのダンプなどするといいかも
No.2
- 回答日時:
浮動小数型って知っていますか?
整数型の1と浮動小数型の1とはメモリの持ち方が違うのです。浮動小数型float型の場合、32ビットあるうち整数値と指数値とに分けられていて、整数値に1、指数値に10の0乗の0を入れるのです。
提示された式は、intからfloatへ直接整数値指数値関係なく上書きされているのでは?
つまりはキャスト変換がうまくいってないのですね。
思いつくのはそんなところです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
最早開始時間と最遅完了時刻を...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
【C++】関数ポインタの使い方
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
(マルチスレッド)_beginthrea...
-
C言語での奇数の和
-
CStringの配列要素を関数で受け...
-
未解決の外部シンボル _printf...
-
C言語でのプログラム
-
int16_t の _t は何?
-
PowerShellがうまくいかない
-
式は定数値が必要です」という...
-
if と配列の組み合わせ
-
2次元配列とポインタの引数受け...
-
C言語のプログラム作成について
-
【C++】行列データの読み込み
-
数字列を3桁ごとにカンマで区切...
-
部分行列の抜き出し(C言語)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
return 1L
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
式は定数値が必要です」という...
-
数字列を3桁ごとにカンマで区切...
-
実数の整数部,小数部の取得
-
C言語でDxlibを使って3x3の奇数...
-
プログラムについて(UNIX)
-
acceptをalarmでタイムアウトさ...
-
C言語の課題です
-
エラー 添字が付けられた値が、...
-
CStringの配列要素を関数で受け...
-
最早開始時間と最遅完了時刻を...
-
入力された数字を大きい順に並...
おすすめ情報