C言語の型キャストと変換をマスターする
あるデータ型を別のデータ型に変換することを型キャストまたは型変換と呼びます。例えば、long型の値をint型変数に格納したい場合、longをintにキャストします。キャスト演算子を使って明示的に変換できます。
(型名) 式
以下の例では、キャスト演算子により整数変数同士の除算を浮動小数点演算として実行しています。
#include <stdio.h>
int main() {
int sum = 17, count = 5;
double mean;
mean = (double) sum / count;
printf("Value of mean : %f\n", mean);
return 0;
}
実行結果:
Value of mean : 3.400000
キャスト演算子は除算より優先順位が高いため、sumの値がまずdouble型に変換され、その後countで除算され、結果はdouble型になります。
型変換はコンパイラが自動で行う暗黙の変換と、キャスト演算子で指定する明示的な変換があります。型変換が必要な場合は、キャスト演算子を明示的に使うのが良いプログラミング習慣とされます。
整数拡張
整数拡張とは、intやunsigned intより「小さい」整数型の値が、intまたはunsigned intに変換されるプロセスです。文字と整数の加算例を見てみましょう。
#include <stdio.h>
int main() {
int i = 17;
char c = 'c'; /* ASCII値は99 */
int sum;
sum = i + c;
printf("Value of sum : %d\n", sum);
return 0;
}
実行結果:
Value of sum : 116
sumが116になるのは、コンパイラが整数拡張を行い、cの値をASCIIコード99に変換してから加算するためです。
通常の算術変換
通常の算術変換は、オペランドの値を共通の型に暗黙的にキャストするために実行されます。コンパイラはまず整数拡張を行い、それでもオペランドの型が異なる場合、以下の階層で最も上位にある型に変換します。

通常の算術変換は、代入演算子や論理演算子&&、||には適用されません。以下の例で理解を深めましょう。
#include <stdio.h>
int main() {
int i = 17;
char c = 'c'; /* ASCII値は99 */
float sum;
sum = i + c;
printf("Value of sum : %f\n", sum);
return 0;
}
実行結果:
Value of sum : 116.000000
まずcが整数に変換されますが、最終結果がdouble(ここではfloatに代入されるためfloat)になるため、通常の算術変換が適用され、iとcがfloatに変換されて加算され、floatの結果が得られます。
C言語