C言語基礎|キャスト(型変換)の基本

キャスト(型変換)の基本 ― 思いどおりの計算結果を得るために

これまでの学習で、
整数どうしの演算では小数部が切り捨てられ、
実数が関わる演算では小数部まで計算されることを学びました。

では、「整数で入力された値を使って、正確な実数の計算結果を得たい」
そんなときは、どうすればよいでしょうか。

その答えが キャスト(型変換) です。

小数部が消えてしまう計算の例

まずは、よくある例から見てみましょう。

問題設定

二つの整数値を読み込んで、
1人あたりの距離 を求めて表示するプログラムを考えます。

サンプルプログラム(小数部が失われる例)

プロジェクト名:chap2-9-1 ソースファイル名:chap2-9-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 距離を人数で割る(整数演算)
#include <stdio.h>

int main(void)
{
    int distance, people;

    puts("距離と人数を入力せよ。");
    printf("距離(km):"); scanf("%d", &distance);
    printf("人数:");       scanf("%d", &people);

    printf("1人あたりの距離は%d kmです。\n", distance / people);

    return 0;
}

実行例

距離(km):85
人数:2
1人あたりの距離は42 kmです。

本来は 42.5 km になってほしいところですが、
結果は 42 になっています。

なぜ小数部が切り捨てられたの?

この式に注目しましょう。

distance / people
  • distance は int
  • people は int

つまり、

int / int

という演算が行われています。

この場合、C言語では
小数部を切り捨てた整数結果 になります。

実数として計算させる方法①:実数で割る

次は、割る数を実数に変えてみましょう。

printf("1人あたりの距離は%f kmです。\n", distance / 2.0);

この場合、

int / double

となり、整数が実数に変換された上で演算が行われます。

実数として計算させる方法②:キャストを使う

しかし、私たちは普段
「2.0 で割ろう」ではなく「2 で割ろう」と考えますよね。

そこで使うのが キャスト です。

キャストを使ったサンプルプログラム

プロジェクト名:chap2-9-2 ソースファイル名:chap2-9-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// キャストを使って実数計算を行う
#include <stdio.h>

int main(void)
{
    int distance, people;

    puts("距離と人数を入力せよ。");
    printf("距離(km):"); scanf("%d", &distance);
    printf("人数:");       scanf("%d", &people);

    printf("1人あたりの距離は%f kmです。\n",
           (double)distance / people);

    return 0;
}

実行例

距離(km):85
人数:2
1人あたりの距離は42.500000 kmです。

今度は、正しく 42.5 が表示されました。

キャストとは何か?

キャスト式の形

(型名) 式

これは、

式の値を、指定した型として扱う

という意味を持ちます。

具体例

キャスト式意味
(int)5.7小数部を切り捨てた 5 を生成
(double)5実数 5.0 を生成
(double)distancedistance を実数として扱う

キャスト演算子のまとめ

項目内容
名前キャスト演算子
書式(型名) 式
働き式の値を指定した型の値として生成

キャストを使った演算の流れ

今回の例では、次の順で処理が行われます。

  1. distance の値を double 型に変換
  2. double / int の演算が行われる。
  3. int が double に格上げされる。
  4. double / double の演算になる。
  5. 実数の結果が得られる。

まとめ:キャストは「計算の指示」

キャストは、
コンピュータに「この値はこの型として扱ってほしい」と伝える指示 です。

状況対応
整数計算で小数が欲しいキャストを使う
型の違いを明確にしたいキャストを使う
意図をコードに残したいキャストは有効

演習問題

演習 2-5

二つの整数値を読み込んで、
前者の値が後者の何%であるかを実数で表示するプログラムを作成せよ。

解答例

プロジェクト名:chap2-9-3 ソースファイル名:chap2-9-3.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int a, b;

    puts("二つの整数を入力せよ。");
    printf("整数a:"); scanf("%d", &a);
    printf("整数b:"); scanf("%d", &b);

    printf("a の値は b の %f%です。\n",
           (double)a / b * 100);

    return 0;
}