C言語基礎|型と演算の関係

型と演算の関係 ― 計算結果は型で決まる

ここまでの学習で、次のことが分かってきましたね。

  • 整数どうしの計算では、小数部が切り捨てられる。
  • 実数どうしの計算では、小数部も含めた結果が得られる。

実は、どんな計算結果になるかは、演算に使われる「型」によって決まる のです。
この節では、型と演算がどのように結びついているのかを、具体例で整理していきます。

オペランドの型が同じ場合の演算

まずは基本から確認しましょう。

同じ型どうしの演算

演算結果の型特徴
int / intint小数部は切り捨て
double / doubledouble実数として計算

重要ポイント

オペランドの型が同一であれば、演算結果も同じ型になる

これは C言語のとても重要なルールです。

型が異なる場合はどうなる?

次に、オペランドの型が異なる場合を考えてみましょう。

  • int / double
  • double / int

このような場合、C言語では 暗黙の型変換 が行われます。

暗黙の型変換とは?

演算を行う前に、

  • 小さい(表現力の低い)型
  • より大きく、表現力の高い型

へと、自動的に変換される仕組みです。

重要ルール(覚えておきましょう)

演算の対象となるオペランドの型が異なるときは、
より大きくて表現力の高い型に揃えられてから演算が行われる

※ ここで言う「大きい」とは、
メモリサイズではなく「小数部を扱えるかどうか」という意味です。

型と演算を確認するサンプルプログラム

ここでは元の例を変更し、
距離と人数を使った計算 で確認してみましょう。

サンプルプログラム

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

// 型と演算の関係を確認するプログラム
#include <stdio.h>

int main(void)
{
    int people;
    double distance;

    people = 3;
    distance = 10.0;

    printf("distance / people = %f\n", distance / people);
    printf("people / distance = %f\n", people / distance);

    printf("people / 2 = %d\n", people / 2);
    printf("people / 2.0 = %f\n", people / 2.0);

    return 0;
}

実行結果例

distance / people = 3.333333
people / distance = 0.300000
people / 2 = 1
people / 2.0 = 1.500000

実行結果を読み解こう

double と int が混ざった演算

解説
distance / peoplepeople が double に変換される。
people / distancepeople が double に変換される。
結果double 型

どちらも double 型どうしの演算 になるため、小数部が残ります。

int どうしの演算

結果理由
people / 21int / int のため切り捨て
people / 2.01.5double に格上げされる。

ここがとても重要なポイントです。

演算結果をどこに代入するかも重要

演算の結果が double 型でも、
代入先が int 型なら小数部は切り捨てられます

演算結果代入先格納される値
7.5int7
7.5double7.5

演算と代入は、別々のルール で動いている点に注意しましょう。

まとめ:型と演算を意識しよう

観点ポイント
同じ型どうし結果も同じ型
異なる型大きい型に揃えられる
int の演算小数部は切り捨て
代入時代入先の型が優先

「計算式は合っているのに結果がおかしい」と感じたときは、
どの型で演算され、どの型に代入されているか
を確認するクセをつけると安心です 😊

演習問題

演習 2-3

読み込んだ実数値をそのまま表示するプログラムを作成せよ。

解答例

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

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

#include <stdio.h>

int main(void)
{
    double x;

    printf("実数を入力せよ:");
    scanf("%lf", &x);

    printf("あなたは %f と入力しましたね。\n", x);

    return 0;
}

演習 2-4

int 型と double 型を混在させた演算を行い、
演算結果と代入結果の違いを確認せよ。

解答例

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

int a = 5;
double b = 2.0;

printf("%f\n", a / b);
printf("%d\n", a / 2);