C言語入門|C言語の型変換を理解する:自動型変換とキャストのしくみ

「えっ、これエラーにならないの?」
C言語を学んでいると、そんな不思議な体験をすることがあります🙂

たとえば、次のようなコードです。

double d = 3;
float  f = 5 + 2.4f;

整数を double 型に代入したり、int と float を足したりしているのに、
コンパイルエラーにはなりません。

「C言語って、型にうるさいんじゃなかったの?」
そう思った人もいるかもしれませんね😄

実はこれ、C言語がいい加減なのではなく、
式が評価される途中で型変換が自動的に行われているからなのです。

この章では、C言語に用意されている
型変換(type conversion) のしくみを、
落ち着いて丁寧に整理していきましょう✨

C言語には3種類の型変換がある

C言語では、プログラムの中で次の3種類の型変換が使われています。

種類内容
代入時の自動型変換代入先の型に合わせて自動変換される。
明示的な型変換開発者が意図的に型を指定して変換する。
演算時の自動型変換演算の途中で型がそろえられる。

これらは、特別な命令を書かなくても自動で働くしくみです。
ただし、知らずに使っていると、
データが壊れてしまう危険もあります⚠️

代入時の自動型変換とは?

まずは、いちばんよく登場する
代入時の自動型変換から見ていきましょう🙂

原則として、
「変数には、その型と同じ型の値しか代入できない」
というルールがありましたね。

int age;

age = 23;     // OK
age = 3.2;    // NG
age = "秘密"; // NG

ところが、次のようなコードはエラーになりません。

float  f = 3;
double d = f;

これは、小さな型から大きな型へ代入するときに限って、
C言語が自動的に型を変換してくれるからです。

型には「大きさの序列」がある

C言語の数値型には、
型変換に関する大小関係(順位)が存在します。

概念的には、次のような並びです👇

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

この並びのポイントはとてもシンプルです。

👉 小さい型の値を、大きい型の変数に入れるのはOK
👉 逆は原則NG(危険)

この関係があるおかげで、次のような代入が可能になります。

float  f = 3;      // int → float に変換
double d = f;      // float → double に変換

実行すると、次のように表示されます。

3.000000
3.000000

代入先の型に合わせて、
値が自然に「姿を変えて」いるわけですね😊

ムリな代入は危険!

では、逆のパターンはどうでしょうか?

int i = 3.2;

これは、
大きな型(double)から小さな型(int)への代入です。

多くのコンパイラでは、
「値が変わる可能性がありますよ」という警告が出ます。

実際に実行すると、

3

と表示され、小数点以下が失われています😱

これは単なる見た目の問題ではありません。
データが壊れている状態です。

警告だからといって無視してはいけません⚠️
ムリな代入は、深刻な不具合の原因になります。

明示的な型変換(キャスト)とは?

「でも、わざと小数を切り捨てたいときもあるよね?」
そう思った人、鋭いです😊

そのような場合に使うのが、
明示的な型変換(キャスト)です。

int age = (int)3.2;

この (int) の部分を
キャスト演算子 と呼びます。

書式は次のとおりです。

(変換先の型名) 式

このコードでは、

  1. 3.2(double型)を int 型に変換
  2. 小数点以下を切り捨てて 3 にする。
  3. 変数 age に代入

という処理が行われます。

キャストは「了承済みの破壊」

ここで、とても大事な考え方があります🙂

キャスト演算子は、
「データが壊れることを理解したうえで行う変換」
です。

age = 3.2;        // NG(警告)
age = (int)3.2;   // OK(意図的)

キャストを使うと警告は出ませんが、
データが失われる事実は変わりません。

そのため、キャスト演算子は
乱暴な道具とも言えます😅

「使えるから使う」ではなく、
「必要だから使う」
という姿勢がとても大切です。

キャストにも限界がある

キャスト演算子は万能ではありません。

主に変換できるのは、

  • 整数型どうし
  • 整数型と小数型

といった数値型の範囲です。

(int)3.14
(double)10

一方で、

  • 文字列を数値に変換する。
  • 数値を文字列に変換する。

といった処理は、キャストではできません。

その場合は、atoi() などの
専用の関数を使う必要があります。

まとめ

ここまでの内容を、感覚的にまとめてみましょう😊

  • 小さい型 → 大きい型:自動で変換される。
  • 大きい型 → 小さい型:危険!警告に注意
  • キャスト:開発者が責任を持って変換を指示
  • キャストは便利だが、乱用してはいけない。

型変換は、
C言語が柔軟に見える理由であり、怖くもある理由
でもあります。

このしくみを理解しておくと、
「なぜこの結果になるのか?」
がスッと説明できるようになりますよ✨