トップC言語入門 > キャスト

キャスト

1.暗黙的型変換とキャスト

C言語の精度は、マシンに依存する。32ビットマシンでは char型は8ビット、short型は16ビット、int型のサイズは 32ビット、 long型はint型と同じ 32ビット、 float型は32ビット、double型は 64ビットである。 int型とfloat型は同じ32ビットサイズであるが、 データ型の自動変換では、次に示すように、 float型の方が優先順位が高いとして扱われる。

char < short < int ≦ long < float < double

優先順位が低いものから高いものへの型変換は情報が失われないことから 自動的に行われる。そうでないときに、キャスト演算子が使われる。

下にプログラム例とその実行結果を示す。この例では (short) が前置演算子の一つであるキャスト演算子である。

#include <stdio.h>

void main() {
    int a = 25, b = 100000, c = -12;

    printf("a=%d (short)a=%d\n", a, (short)a);
    printf("b=%d (short)b=%d\n", b, (short)b);
    printf("c=%d (short)c=%d\n", c, (short)c);
}
c:\MH\www\c01\cast>cast01
a=25 (short)a=25
b=100000 (short)b=-31072
c=-12 (short)c=-12

a と c はその値が 16ビットで表現できるため、 short型にキャストしても情報は失われないが、 b の値は、short型の範囲 -32768 〜 32767 を超えているため、 情報の欠落が起きる。

(short)演算子が何を行っているか、TCCのコンパイル結果を調べると、 次の通りである。最初に、16ビット左に論理シフトしている。 次に右に16ビット算術シフトしている。最上位ビットは保存される。 すなわち、上位の16ビットは無視し、下位16ビット中の最上位ビットが 上位16ビットにコピーされる。上位16ビットはオール0かオール1となる。 16ビットを32ビットに符号拡張したのと同じである。

00401041 C1E010                 shl     eax,10h
00401044 C1F810                 sar     eax,10h
00401047 50                     push    eax

2.有効桁数

int < float
であるから、int から float へは暗黙の変換が行われる。 「優先順位が低いものから高いものへの型変換は情報が失われない」としたが、 有効数字の関係で、情報が失われるケースがある。

例えば、次のプログラムはエラーなくコンパイルできる。

// test.c
#include <stdio.h>
#include <limits.h>

int main (int argc, char *argv[]) {
    int n = INT_MAX - 33; 
    float v = n;

    printf("n=%d, v=%.0f\n", n, v);
    return 0;
}

このプログラムの実行結果は次のようになる。 同じ32ビット幅でも、int型の方が有効桁数は大きいから、 有効桁数の少ない float型に変換すると、値が変わることがある。 数値計算では有効桁数を意識しておかねばならない。

c:\sys>test
n=2147483614, v=2147483648