型変換については、第4章で簡単に説明しましたが、複雑な規則があり、迷うことの多い部分です。ですから、ここで少し詳しく算術型の型変換について説明してみようと思います。
なお、説明中で用いたコードの実行結果は「Borland C++ Compiler 5.5」(int:4バイト short:2バイト char:1バイト)で確認をしています。
文字型や整数型などの汎整数型の場合、型が、int より小さな場合(char, signed char, unsigned char, short, unsigned short)は、演算の最初に int か、表現できなければunsigned int に変換されます。このとき、符号を含めてその値を変えることはありません。
(例)short a = 30000, b = 30000; printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(b) = %d\n", sizeof(b)); printf("sizeof(~a) = %d\n", sizeof(~a)); printf("sizeof(a + b) = %d\n", sizeof(a + b)); printf("a + b = %d\n", a + b); |
実行結果sizeof(a) = 2 sizeof(b) = 2 sizeof(~a) = 4 ← int に変換してから~演算 sizeof(a + b) = 4 ← int に変換してから+演算 a + b = 60000 ← 4バイトなので60000が扱える |
次に、以下の規則にしたがって、暗黙の型変換及び明示的型変換(キャスト)が行われます。
汎整数型から汎整数型への変換は、符号の有無により、次のように型変換されます。
(例)unsigned short a = 1234; unsigned char b; b = a; printf("b = %d\n", b); printf("a %% (255 + 1) = %d\n", a % 256); |
実行結果b = 210 a % (255 + 1) = 210 |
・A が 0 以上
Aの型サイズ ≦ Bの型サイズ : 値は不変(例)short a = 1234; unsigned char b; b = a; printf("b = %d\n", b); printf("a %% (255 + 1) = %d\n", a % 256); |
実行結果b = 210 a % (255 + 1) = 210 |
・Aが負
Aの型サイズ ≦ Bの型サイズ : A + (Bの型の表現しうる最大値+1)(例)short a = -1234; unsigned short b; b = a; printf("b = %d\n", b); printf("a + (65535 + 1) = %d\n", a + 65536); |
実行結果b = 64302 a + (65535 + 1) = 64302 |
※ 「LSI C-86 Ver. 3.30c試食版」では、ユーザーズマニュアルの「4.1.1 言語仕様」に「整数の格上げ(Integral promotion)ルールがANSIの定義とは若干異なっています。」と記載されているように、上記の規則に沿わない点がいくつかあります。
以上をまとめると、
2項・3項演算子を用いて算術演算を行う場合には、次の順番で算術変換が行われます。これは、暗黙の型変換及び明示的型変換時に適用されます。
キャストは、「4−2.明示的型変換(キャスト)」で説明したように、キャスト演算子を用いて、強制的に型変換を行うものですが、紛らわしい点がありますので、以下に具体的な使い方をまとめます。
double x; int a = 10, b = 3; x = a / b; /* x = 3.0 */ |
x = (double) a / (double) b; /* x = 3.333333 */ |
x = (double) a / b; /* x = 3.333333 */ |
x = (double) (a / b); /* x = 3.0 */ |
double x; int a = 10, b = 3, c = 5, d = 2; x = a / b + c / d; /* x = 5.0 */ |
x = (double) a / b + c / d; /* x = 5.333333 */ |
x = (double) a / b + (double) c / d; /* x = 5.833333 */ |
▲▲TOP▲▲
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved