Cは型の違う値どうしの計算を、黙って調整して実行します。便利ですが、黙っているぶん事故にも気づきにくい。自動で起きる変換と、自分で指示する変換を分けて押さえます。
暗黙の型変換——自動で起きる
#include <stdio.h>
int main(void) {
int n = 3;
double d = 1.5;
double kekka = n + d; // n が 3.0 に変換されてから足される
printf("%.1f\n", kekka);
return 0;
}出力は 4.5。intとdoubleを混ぜると、情報が失われない方向(int → double)へ揃えてから計算されます。これが暗黙の型変換です。char と int を混ぜたときも同じで、char が int に格上げされます。
逆向きは削られる
#include <stdio.h>
int main(void) {
double nedan = 199.9;
int seisuu = nedan; // 小数点以下が消える
char chiisai = 300; // char に収まらない
printf("%d\n", seisuu);
printf("%d\n", chiisai);
return 0;
}seisuu は 199 です。四捨五入ではなく切り捨て。chiisai は 300 にはならず、44 のような別の値になります(1バイトに300は入らないため)。どちらもエラーにはならず、警告が出る程度で通ってしまいます。
明示の型変換(キャスト)——自分で指示する
#include <stdio.h>
int main(void) {
int tokuten = 173;
int ninzuu = 4;
printf("%.2f\n", (double)tokuten / ninzuu);
printf("%d\n", (int)(3.7 + 0.5));
return 0;
}(型名)値 と書くのがキャストです。1つ目は 43.25——(double) を片方に付けるだけで、計算全体が小数の世界に移ります。2つ目は 4。+0.5 してから (int) で切り捨てることで、正の数の四捨五入になります(定番の書き方です)。
罠・注意
キャストは「変換の命令」であって「安全宣言」ではない。 (char)300 と書けば警告は消えますが、値は壊れたままです。警告を消すためだけのキャストは、バグを隠す行為になります。
割り算のキャストは「割る前」に。 (double)(a / b) では手遅れ。(double)a / b と書きます。
double → int は常に切り捨て。 -2.7 は -2 です(0の方向へ)。
大きい型へは安全、小さい型へは危険。 int → double は安全、double → int や long long → int は情報が消えます。
まとめ
型が混ざると、情報が失われない方向(int → double)へ自動で揃えられます。逆向きの代入では切り捨てや情報落ちが黙って起きます。意図があるときは (double) のようにキャストで明示し、割り算では必ず「割る前に」変換します。