型変換とは
3-1のプログラムで、int同士の割り算では小数部は切り捨てられると説明しました。しかし実際ではint同士の計算でも小数を扱いたいときがあります。そんな時はintの整数をdouble型の小数に変換すればいいのです。この型を変える処理を型変換またはキャストと言います。
(型名)変数名や値など
例えばdouble型に変換する時は変数の名前の前に(double)と書きます。double型以外の型も同様です。
#include <stdio.h>
int main(void){
int a,b;
puts("a=?");
scanf("%d",&a);
puts("b=?");
scanf("%d",&b);
printf("int:a/b=%d\n",a/b);
printf("double/double:%f\n",(double)a/(double)b);
printf("int/double:%f\n",a/(double)b);
printf("double/int:%f\n",(double)a/b);
printf("(double)int/int:%f\n",(double)(a/b));
return 0;
}
実行結果
a=?
5
b=?
3
int:a/b=1
double/double:1.666667
int/double:1.666667
double/int:1.666667
(double)int/int:1.000000
サンプルコードのように、aかbどちらかをdoubleにキャストすると正しく小数で計算できています。C言語には暗黙の型変換というルールがあり、intとdoubleの計算をするとき自動的にintの数値がdoubleにキャストされます。つまり、サンプルコードの10行目と11行目の計算は内部的にに9行目と同じdouble同士の割り算となります。
12行目の結果はなぜ1になっているのでしょうか?
12行目の割り算はa/bにカッコがついているのでa/bがまず計算され、int同士の割り算なので小数部は切り捨てられます。そのあとdoubleにキャストされるので、double型の1が画面に表示されます。よって、画面には1.000000と表示されます。
暗黙の型変換
先ほどintとdoubleの計算で暗黙の型変換により二つともdoubleにキャストされると書きました。これはdoubleの方がintよりも表現できる数字の範囲が大きいからです。このようにC言語では異なる型同士の計算のとき表現できる数字が大きい方の型にキャストされます。
型A | 型B | AとBのうち表現幅が広い型 |
short (signed) char | int | int |
unsigned short unsigned char | unsigned | unsigned |
long | int | long |
unsigned long | unsigned | unsigned long |
long long | long | long long |
unsigned long long | unsigned long | unsigned long long |
float | long long unsigned long long | float |
double | float | double |
long double | double 任意の整数型や小数型 | long double |
この表からわかるように、最も大きい型はlong doubleです。この表にない比較、例えばunsignedとlongなどの場合の暗黙の型変換は、具体的な数値によって異なります。
まとめ
型変換には、明示的に変換する型変換と、暗黙の型変換の2種類がある。
明示的に変換する場合は、(型名)とする。
暗黙の型変換は、表現できる数値の幅が広い型に自動的に変換される。
コメント