- ベストアンサー
int型の割算
ご存知の方教えていただけますか? 以下のコードで実行するとansが0.5ではなく0になってしまうのですが なぜでしょうか? int a = 64; // a=1,b=2でも0になってしまいます。 int b = 128; float ans; ans = a/b; printf("ans = %f",ans) 仕様ですか? 大変申し訳ありません。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
一言で言えば、仕様です。 ふたつの側面がありますが。 まずひとつ。Cでは、int 型通しの演算の結果は、int です。 ですから、 a / b の計算結果は、int になります。 次、 ans = a / b ; は、一見、ans が float なので、float 型の結果が得られそうですが、右辺が int なので、float = int という代入が発生しているに過ぎません。 このため、 a / b の結果が(int として) 0 ans = 0; という代入が行われて、ans の結果はゼロになります。 これを防ぐためには、a か b のいずれかを float にしてやればいいわけで、 ans = (float)a / b; ans = a / (float)b; のいずれも答えは、0.5 になります。 これは、int と float の演算は、「int の方を float に変換した上で計算して、結果は float」という決まりだからです。 ans = (float)a / (float)b; でも同じですね。 ただ、 ans = (float)(a / b); では結果はやはりゼロになります。 というか、この場合は、 ans = a / b; と同じことです。 あと、普通の場合、float を使うよりは、double を使った方が良いと思います。
その他の回答 (1)
- jacta
- ベストアンサー率26% (845/3158)
> 仕様ですか? 仕様です。 小学校低学年で習ったことを思い出してみましょう。 64 ÷ 128 = 0 ... 64 ですね。 int型は整数型ですので、演算結果も整数しか扱えません。整数を浮動小数点型の変数(今回であればans)に代入したとしても、元々持っていない情報が補完されるわけではありません。
お礼
>一見、ans が float なので、float 型の結果が得られそうですが、右辺が int なので、float = int という代入が発生しているに過ぎません よく理解できました。 ありがとうございます。 >ans が float なので、float 型の結果が得られそうですが そうなると思っていました。