第20回
いろいろな演算子~演算子の優先順位

型キャスト演算子~(型名)

Cは型の扱いが厳密な言語で、型が異なると変数への代入ができません。それでは不都合な場合が多いため、強制的に型を変換して代入する『型キャスト』ができるようになっています。

()で型名を変換する

先の例で、malloc関数の戻り値であるvoid型のポインタを、以下のようにして*_itemという構造体のポインタ型に変換しました。

p = (_item *)malloc(sizeof(_item));~
例えば同じ整数型でも、short int型の変数にlong int型の値を代入するような式はエラーとなります。

short int x;
long int y;
y = 100L;
x = y;
  ↑ たとえyの値がshort intに収まる場合でも代入はできない
そのような場合に、()内に型名を記述して強制的に型を変換するのが『型キャスト』です。上記の式なら、以下のようにしてlong int型をshort int型に変換します。
x = (short int)y;

値の丸めに注意

ただし、変換前の値が変換後の型(キャストした型)の制約(値の上限や小数点以下の値の保持など)を超える場合は、変換後の型に合わせて丸めが行われるため、元の値を保持できなくなります。

一般によく用いられるのは、上記のようなshortとlong、小数点を扱うfloatとdouble、そして先の例に掲げたvoid型ポインタをそれ以外のポインタ型へ──という変換です。floatやdouble型の小数点数をint型の整数にキャストすると、当然ながら小数部分が丸められてしまいます。

long int型の定数

先の例では、long int型の変数yに定数の100を代入する際、以下のように値の後ろに"L"と記述しました。

y = 100L;
Cでは、数値の定数は標準でint型とされます。int型は『処理系が最も効率的に処理できる整数型』と定義されているため、short(16ビット)の場合とlong(32ビット)の場合があります。これを明示的にlong int型の値とする場合には、数値の後ろに"L"を付けます ※2

昔はCPUによってint型が16ビットだったり32ビットだったりするケースが多かったため、特にパソコン出身のプログラマーの中には「16ビットで収まりそうにない値のときはlong、それ以外は何でもint」というスタイルを採る人も少なからずいました。その傾向は今でも尾を引いていますが、特に学習の段階でこういった曖昧な型の扱いはよくないと考えるので、本コラムではshort intとlong intを明確に使い分けるようにしています