C では1つの式の中に異なる型を混在させることができる。これは、式中に異なる方が現れた時に、どのように解消するかが決められているから。
整数拡張
式中に char や short int が使われていると、その式が評価されるときに必ず int に拡張される。ただし、この拡張は式の評価時だけの一時的なものであって、変数自体が拡張されるわけではないので注意。
型の昇格
整数拡張のあと、コンパイラはすべてのオペランドを一番大きなオペランドに合わせて変換する。これを型の昇格という。昇格の規則は次の通り。上から順に見ていって、当てはまる変換が行われる。
一方のオペランドの型 | もう一方のオペランドが昇格する型 |
long double | long double |
double | double |
float | float |
unsigned long | unsigned long |
long | long |
unsigned | unsigned |
要するに、大きな方のオペランドの型にもう一方も変換されるってことだ。
1つ、特殊なケースがある。一方が long、もう一方が unsigned int で、しかもその unsigned int の値を long で表せない場合、両方が unsigned long に変換される。
例
次のプログラムは、int と float の演算をしているけど、変数 i が float に変換されて、出力は float になる。
#include int main(void) { int i; float f; i = 10; f = 23.25; printf("%f\n", i * f); return 0; }
takatoh@nightschool $ ./sample_4_5a 232.500000
もう1つ。型変換の規則は演算のひとつひとつについて適用されるので、次のプログラムでは、(10 / 3) は整数であり、100.0 を割るときに初めて float に変換されるので、答えは 33.3333… になる(3.0 にはならない)。
#include int main(void) { printf("%f\n", 100.0 / (10 / 3)); return 0l; }
takatoh@nightschool $ ./sample_4_5b 33.333333