通常の算術変換
ほとんどの C 演算子は、式のオペランドを共通型に取り込むか、コンピューター操作に使用される整数のサイズに short 値を拡張する型変換を実行します。 C 演算子によって実行される変換は、特定の演算子およびオペランドの型によって異なります。 ただし、多くの演算子は、整数型および浮動小数点型のオペランドに対して同様の変換を実行します。 これらの変換は "算術変換" と呼ばれます。オペランド値を互換性のある型に変換しても、その値は変更されません。
以下にまとめた算術変換は、"通常の算術変換" と呼ばれます。これらの手順は、数値型を要求する二項演算子の場合にのみ適用されます。 目的は、結果の型でもある共通型を導入することです。 実際にどの変換が行われるかを確認するために、コンパイラは式のバイナリ操作に次のアルゴリズムを適用します。 次の手順は優先順ではありません。
どちらかのオペランドが
long double
型の場合、もう一方のオペランドはlong double
型に変換されます。上の条件が満たされず、どちらかのオペランドが
double
型である場合、もう一方のオペランドはdouble
型に変換されます。上の 2 つの条件が満たされず、どちらかのオペランドが
float
型の場合、もう一方のオペランドはfloat
型に変換されます。上の 3 つの条件が満たされない場合 (どのオペランドも浮動小数点型でない場合)、オペランドに対して次のように整数変換が実行されます。
どちらかのオペランドが
unsigned long
型の場合、もう一方のオペランドはunsigned long
型に変換されます。上の条件が満たされず、どちらかのオペランドが
long
型で、もう一方がunsigned int
型である場合、両方のオペランドがunsigned long
型に変換されます。上の 2 つの条件が満たされず、どちらかのオペランドが
long
型である場合、もう一方のオペランドはlong
型に変換されます。上の 3 つの条件が満たされず、どちらかのオペランドが
unsigned int
型である場合、もう一方のオペランドはunsigned int
型に変換されます。上記いずれの条件にも一致しない場合、両方のオペランドが
int
型に変換されます。
次のコードは、これらの変換規則を示します。
float fVal;
double dVal;
int iVal;
unsigned long ulVal;
dVal = iVal * ulVal; /* iVal converted to unsigned long
* Uses step 4.
* Result of multiplication converted to double
*/
dVal = ulVal + fVal; /* ulVal converted to float
* Uses step 3.
* Result of addition converted to double
*/