★キャストについて★


ある型の変数に別の型のデータを入れようとすると警告が出るケースがあります。

<sample program col029-01>

#include <stdio.h>

int main(void)
{
    int a;

    a = 1.5;
    
    return 0;
}

コンパイル結果

  warning C4244: '=' : 'double' から 'int' への変換です。データが失われる可能性があります。

int型は整数しか扱えませんから、小数以下は切り捨てられるため警告が出ています。

警告ですから実行は出来ますが、実行された時にdouble型からint型へ変換され、小数点以下が無くなります。


逆はどうでしょう?

<sample program col029-02>

#include <stdio.h>

int main(void)
{
    double a;

    a = 8;
    
    return 0;
}

double型の変数に8を代入しました。

8は整数定数ですのでint型ですが、切り捨てられるものもないので警告は出ていません。

ただし、代入する際に内部でint型からdouble型に変換されています。

これを「暗黙の型変換」と言います

簡単に言ってしまうと「問題ないようであれば勝手に型変換します」ということです。


警告についてはエラーと同じと書きましたので、対処しないといけません。

ただ、小数点以下が切り捨てられることを意図してプログラムを組むこともありますよね。

このような場合、キャストという対処方法があります。

<sample program col029-03>

#include <stdio.h>

int main(void)
{
    int a;

    a = (int)1.5;
    
    return 0;
}

1.5の前に(int)と付けただけですが、コンパイルの際に警告が出なくなっていることを確認してください。

キャストとは「明示的な型変換」であり、プログラマが意図して型変換を行っていることを表します。


キャストは何にでも対応出来るものではなく、慎重に使うべきものです。

後に出てくるポインタなど、キャストを乱用すると危険なケースも多くあります。

ここでは対応できない例として異なる構造体への代入をあげてみます。

<sample program col029-04>

#include <stdio.h>

typedef struct
{
    int hp;
    int mp;
} Player;

typedef struct
{
    int hp;
    int mp;
} Enemy;

int main(void)
{
    Player p1 = { 100, 50 };

    Enemy e1;

    e1 = p1;
    
    return 0;
}

構造体PlayerとEnemyはメンバ変数が同じです。

しかし、代入しようとすると、

コンパイル結果

  error C2440: '=' : 'Player' から 'Enemy' に変換できません。

という「エラー」になります。


これをキャストで対応しようとすると、

<sample program col029-05>

#include <stdio.h>

typedef struct
{
    int hp;
    int mp;
} Player;

typedef struct
{
    int hp;
    int mp;
} Enemy;

int main(void)
{
    Player p1 = { 100, 50 };

    Enemy e1;

    e1 = (Enemy)p1;
    
    return 0;
}

コンパイル結果

  error C2440: '型キャスト' : 'Player' から 'Enemy' に変換できません。

という「エラー」になります。

構造体はメンバ変数が全く同じでも、代入できないのです。


ブラウザの戻るボタンで戻ってください。