型変換

計算式は常に型を意識する必要があります。たとえば以下の例では、希望としては 0.165 ...が rate に代入されてほしいところですが、実際には 0.0 が代入されます。

  int hit;
  float rate;
  hit=20;
  rate=hit / 121;

理由は hit と 121 はともに整数型なので、hit / 121 の演算は整数演算として処理され、結果が 0 となり、それが実数型に変換されて rate に格納されたためです。

こうした場合は、演算が実数型で行われるように演算途中で以下のように明示的に型の指定をします。

  rate=(float)hit / 121.0;

例では変数の前に「( )」でくくって型指定を入れています。また、121 は整数型でしたが 121.0 と明示的に実数型であることを示しています。これで rate には 0.165... が代入されます。
型はある程度自動的に合わせてくれますから、もし演算の片側が実数型の場合は、その精度に合わせて自動的に実数型で演算をしてくれます。つまり rate=hit / 121.0; または rate=(float)hit / 120; とだけ書いても構いません。

逆に実数型の計算結果を整数型に型変換すると、その結果は少数以下を切り落としたものになります。つまり以下の計算結果は 2.857 ではなく2 になります。

  int a;
  a=20.0/7.0;

また、計算途中で明示的に整数化することもできます。若干トリッキーな記述になってしまいますが、以下の計算結果は 3.5 になります。どこからどこまでが整数型で演算され、どこから実数型となったのか追いかけてみると良いでしょう。

  float b;
  b=(int)(20.0/7.0)+1.5;

このようなトリッキーな記述はバグを発生させがちで、あまりするべきではありませんが、実数変数と整数変数を混在させて演算させていると、つい型が異なる演算で少数以下の扱いが違っていることに気づかず、計算が合わなくて困ることがあります。
トリッキーな記述は避けるとしても、知識として演算には型があり、こうしたことが発生する、と言うことを覚えておくとよいでしょう。


Yutaka Yasuda (yasuda@cc.kyoto-su.ac.jp)