式内部での型変換

2015年5月2日
1 分

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