Popularne konwersje arytmetyczne
Większość operatorów C wykonuje konwersje typu, aby doprowadzić operandy wyrażenia do typu wspólnego lub rozszerzyć krótkie wartości do rozmiaru liczby całkowitej używanej w operacjach maszyny.Konwersje wykonywane przez operatory C zależą od danego operatora i typu operandu lub operandów.Jednak wiele operatorów wykonuje podobne konwersje operandów typu całkowitego i zmiennoprzecinkowego.Konwersje te są znane jako "konwersje arytmetyczne". Konwersja wartości operandu na zgodny typ nie powoduje żadnych zmian jego wartości.
Konwersje arytmetyczne podsumowane poniżej są nazywane "zwykłymi konwersjami arytmetycznymi". Następujące kroki są stosowane tylko dla operatorów dwuargumentowych, które oczekują typu arytmetycznego.Celem jest wydobycie wspólnego typu, który jest również typem wyniku.Aby ustalić, które konwersje faktycznie się odbywają, kompilator stosuje następujący algorytmu dla operacji dwuargumentowych w wyrażeniu.Poniższe kroki nie mają kolejności pierwszeństwa.
Jeśli operand jest typu long double, inny operand jest konwertowany na typ long double.
Jeśli powyższy warunek nie jest spełniony i operand jest typu double, inny argument jest konwertowany na typ double.
Jeśli dwa powyższe warunki nie są spełnione, a operand jest typu float, inny argument jest konwertowany na typ float.
Jeśli powyższe trzy warunki nie są spełnione (żaden operand nie jest typu zmiennoprzecinkowego), na operandach wykonywane są następnie konwersje całkowite w następujący sposób:
Jeśli operand jest typu unsigned long, inny operand jest konwertowany na typ unsigned long.
Jeśli powyższy warunek nie jest spełniony i operand jest typu long i inny jest typu unsigned int, oba operandy są konwertowane na typ unsigned long.
Jeśli dwa powyższe warunki nie są spełnione, a operand jest typu long, inny argument jest konwertowany na typ long.
Jeśli trzy powyższe warunki nie są spełnione, a operand jest typu unsigned int, inny argument jest konwertowany na typ unsigned int.
Jeśli żaden z powyższych warunków nie jest spełniony, oba operandy są konwertowane na typ int.
Poniższy kod ilustruje te reguły konwersji:
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
*/