C言語入門|演算時の型変換を理解する:異なる型同士の計算はどのように処理されるか

「代入のときに型変換が起こるのは分かったけど、
計算の途中ではどうなってるの?」🤔

ここまで学んできた人なら、きっとこんな疑問が浮かびますよね。
実はC言語では、演算の途中でも自動的に型変換が行われています

このしくみを知らないまま計算式を書くと、
「思った結果と違う!」
「なぜ小数が消えた?」
といったトラブルにハマりがちです😅

ここでは、演算時の自動型変換がどのように働いているのかを、
じっくり・やさしく整理していきましょう。

演算でも「型はそろえてから」が原則

まず大前提として、C言語ではこう考えてください🙂

👉 演算は、左右の型をそろえてから行われる

これは代入時と同じ考え方です。
算術演算子(+、−、*、/ など)を使う場合でも、
左右のオペランドは同じ型で計算されるのが原則です。

では、同じ型同士で演算するとどうなるのか、
割り算を例に見てみましょう。

計算結果
5 / 2(int 同士)2(int)
5.0 / 2.0(double 同士)2.5(double)

この結果から分かる大事なポイントはこれです👇

👉 計算結果の型は、使われたオペランドの型になる

int 型同士なら int 型の結果、
double 型同士なら double 型の結果になります。

整数同士の割り算が怖い理由😨

ここで一度、よくある落とし穴に触れておきましょう。

int result = 5 / 2;

この結果は 2 です。
「2.5 じゃないの?」と思った人は要注意⚠️

5 も 2 も int 型なので、
整数の世界で計算が完結してしまうからです。

小数点以下は、
「最初から存在しなかったこと」にされます😱

異なる型同士で演算するとどうなる?

では、ここからが本題です✨
異なる型同士で演算を行った場合、C言語はどう動くのでしょうか?

答えはとてもシンプルです。

👉 意味的に大きな型に統一してから計算する

以前に学んだ、型の大小関係を思い出してください🙂

char → short → int → long → float → double
(小)                      (大)

この並びのうち、
より大きい型に合わせて変換されるのが演算時のルールです。

異なる型の割り算の流れを見てみよう

次の式を例に、処理の流れを追ってみましょう。

5.0 / 2

この式では、

  • 5.0 は double 型
  • 2 は int 型

ですね。

C言語は、次のように処理します👇

1️⃣ int 型の 2 を double 型の 2.0 に変換
2️⃣ double 同士で割り算を実行
3️⃣ 結果は double 型になる

つまり、内部ではこうなっています。

5.0 / 2.0 → 2.5

「先に型をそろえてから計算」
この姿勢は、C言語の一貫したルールなんですね😊

異なる型同士の演算例(サンプルプログラム)

ここで、異なる型同士の演算を含むプログラムを、
少し内容を変えて見てみましょう。

プロジェクト名:3-8-1 ソースファイル名: sample3-8-1.c

#include <stdio.h>

int main(void)
{
    double price = 9.0 / 4;   // 4(int)→ 4.0(double)に変換
    long   total = 6 + 3L;    // 6(int)→ 6L(long)に変換

    printf("%f\n", price);
    printf("%ld\n", total);

    return 0;
}

実行結果は次のとおりです。

2.250000
9

ここでも、演算の前に型がそろえられていることが分かりますね🙂

printf も型に注意しよう!

ちなみに、ここで使っている printf も
型に応じた書式指定子を使う必要があります。

書式指定子
int%d
long%ld
float / double%f

今回の例では、
long 型を表示するために %ld を使っています。

型変換だけでなく、
表示のしかたまで含めて型を意識する
これがC言語上達の近道です✨

演算時の型変換をまとめると😊

ここまでの内容を、頭の中で整理してみましょう。

  • 演算は、左右の型をそろえてから行われる。
  • 同じ型同士なら、その型のまま計算される。
  • 異なる型同士なら、意味的に大きな型に変換される。
  • 計算結果の型は、統一されたあとの型になる。

つまりC言語は、

👉 勝手に計算するのではなく、必ずルールに従って変換してから計算する

という、とても律儀な言語なんです😄

型を意識できると、バグが減る✨

演算時の型変換を理解すると、

  • 整数の割り算で小数が消える理由
  • なぜ double を混ぜると結果が変わるのか
  • キャストが必要な場面と不要な場面

こうした疑問が一気にスッキリします😊

「なんとなく動いてる」から
「理由が分かって動いている」へ。

これが、C言語を一段レベルアップして使えるようになる瞬間です👍