Popularne konwersje arytmetyczne

Większość operatorów języka C wykonuje konwersje typów, aby przenieść operandy wyrażenia do wspólnego typu lub rozszerzyć krótkie wartości do rozmiaru całkowitego używanego w operacjach maszynowych. Konwersje wykonywane przez operatory języka C zależą od określonego operatora i typu operandów lub operandów. Jednak wiele operatorów wykonuje podobne konwersje na operandach typów całkowitych i zmiennoprzecinkowych. Te konwersje są nazywane "konwersjami arytmetycznymi". Konwersja wartości operandu na zgodny typ nie powoduje zmiany jego wartości.

Konwersje arytmetyczne podsumowane poniżej są nazywane "zwykłymi konwersjami arytmetycznymi". Te kroki są stosowane tylko dla operatorów binarnych, które oczekują typu arytmetycznego. Celem jest uzyskanie typowego typu, który jest również typem wyniku. Aby określić, które konwersje rzeczywiście mają miejsce, kompilator stosuje następujący algorytm do operacji binarnych w wyrażeniu. Poniższe kroki nie są kolejnością pierwszeństwa.

  1. Jeśli jeden z operandów ma typ long double, drugi operand jest konwertowany na typ long double.

  2. Jeśli powyższy warunek nie zostanie spełniony, a jeden z operandów jest typu double, drugi operand jest konwertowany na typ double.

  3. Jeśli powyższe dwa warunki nie są spełnione, a jeden z operandów jest typu float, drugi operand jest konwertowany na typ float.

  4. Jeśli powyższe trzy warunki nie zostaną spełnione (żaden z operandów nie ma typów zmiennoprzecinkowych), konwersje całkowite są wykonywane na operandach w następujący sposób:

    • Jeśli jeden z operandów ma typ unsigned long, drugi operand jest konwertowany na typ unsigned long.

    • Jeśli powyższy warunek nie zostanie spełniony, a albo operand jest typu long , a drugi typ unsigned int, oba operandy są konwertowane na typ unsigned long.

    • Jeśli powyższe dwa warunki nie są spełnione, a jeden z operandów jest typu long, drugi operand jest konwertowany na typ long.

    • Jeśli powyższe trzy warunki nie są spełnione, a jeden z operandów jest typu unsigned int, drugi operand jest konwertowany na typ unsigned int.

    • Jeśli żaden z powyższych warunków nie zostanie spełniony, oba operandy zostaną przekonwertowane na typ int.

Poniższy kod ilustruje następujące 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
                      */

Zobacz też

Operatory języka C