支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


1.C言語にて型を変換

型変換とはプログラムにおいて、あるデータ型を他のデータ型に変換することとなります。型キャストとも呼ばれます。

・暗黙の型変換
暗黙の型変換とは、明示的に指定しなくてもコンパイラの判断によって自動的に行われる型変換で、型強制とも呼ばれます。C言語の暗黙の型変換は、曖昧さがなく、その型変換が安全な場合のみ発生します。
①代入時の型変換
C言語の変数を代入する式で、左辺の型と右辺の型が異なっている場合は、左辺の型に変換して代入されます。この時、左辺の型が右辺の型より大きい場合は問題ありませんが、左辺の型が右辺の型より小さい場合は、情報の損失が発生します。
②式内の型変換
C言語の式の中で異なる型の変数等が現れたときは、精度の高い方の型にあわせます。以下は、暗黙の型変換及び明示的型変換時に適用されます。
一方が「long double」の場合、他方を「long double」に型変換する。
一方が「double」の場合、他方を「double」に型変換する。
一方が「float」の場合、他方を「float」に型変換する。
一方が「unsigned long int」の場合、他方を「unsigned long int」に型変換する。
一方が「long int」の場合、他方が「unsigned int」で、更に「long int」が「unsigned int」のすべてが表現できる場合、「long int」に型変換する。 「long intがunsigned int」のすべてを表現できない場合、「unsigned long int」に型変換する。
一方が「long int」の場合、他方を「long int」に型変換する。
一方が「unsigned int」の場合、他方を「unsigned int」に型変換する。
上記に該当しない場合には、「int」に型変換する。
例を以下に記載します。
以下の場合には、C言語の暗黙の型変換が正常に実行されます。
#include <stdio.h>
int main(void)
{
short sNum1 = 100;
long lNum2;
// short型からlong型に型変換が行われる
lNum2 = sNum1;
return 0;
}
以下の場合には、C言語の暗黙の型変換が正常に実行されずエラーとなります。
#include <stdio.h>
int main(void)
{
long lNum1 = 100;
short sNum2;
// long型からshort型に型変換を行おうとしてエラーとなる
sNum2 = lNum1;
return 0;
}

・明示的な型変換
明示的な型変換とは、キャストによって明示的に型を指定して行う型変換のこととなります。値の前に括弧で括ったデータ型を記述し、型を強制的に変換します。
例を以下に記載します。以下の内容は、C言語の暗黙の型変換で実施しようとするとエラーになりますが、明示的な型変換の場合正常に実行されます。
#include <stdio.h>
int main(void)
{
long lNum1 = 100;
short sNum2;
// long型からshort型にキャストを使って明示的に型変換が行われる
sNum2 = (short)lNum1;
return 0;
}
明示的な型変換を行う際の注意点は以下となります。
double型などの浮動小数点数型からint型などの整数へキャストする場合は小数点以下が切り捨てられます。
#include <stdio.h>
int main(void)
{
int iNum1;
double dNum2 = 3.14;
// double型変数からint型変数へのキャスト、結果は3となります
iNum1 = (int)dNum2;
return 0;
}
マイナスの値の変数を符号なし型の変数にキャストしてもマイナスを取った値にはなりませんので、意図しない値となります。
#include <stdio.h>
int main(void)
{
char chr = -100;
unsigned char uchr;
// 符号付きchar型変数から符号なしchar型変数へのキャスト、結果は156となります
uchr = (unsigned char)chr;
return 0;
}
型の範囲外の値を代入して意図しない値になることをオーバーフロー(桁あふれ)といいます。範囲の大きい型から小さい型へキャストする場合はこのオーバーフローが起こる可能性があります。
#include <stdio.h>
int main(void)
{
int num = 1000;
char chr;
// int型変数からchar型変数へのキャスト、結果は-24となります
chr = (char)num;
return 0;
}

2.最後に

C言語の「暗黙の型変換」とは、コンパイラが安全だと判断し、自動的にデータ型を拡張してくれる機能となります。 C言語の「明示的な型変換」とは、コンパイラの型チェックを無効化するため、データ変換を行う際に処理を記述する側で注意をする必要があります。