Share via


Gebruikelijke rekenkundige conversies

De meeste C-operators voeren typeconversies uit om de operanden van een expressie naar een gemeenschappelijk type te brengen of om korte waarden uit te breiden naar de gehele grootte die wordt gebruikt in machinebewerkingen. De conversies die door C-operators worden uitgevoerd, zijn afhankelijk van de specifieke operator en het type operand of operands. Veel operators voeren echter vergelijkbare conversies uit op operanden van integrale en zwevende typen. Deze conversies worden 'rekenkundige conversies' genoemd. Bij de conversie van een operandwaarde naar een compatibel type wordt de waarde niet gewijzigd.

De rekenkundige conversies die hieronder worden samengevat, worden 'gebruikelijke rekenkundige conversies' genoemd. Deze stappen worden alleen toegepast voor binaire operators die rekenkundige typen verwachten. Het doel is om een gemeenschappelijk type op te geven dat ook het type resultaat is. Om te bepalen welke conversies daadwerkelijk plaatsvinden, past de compiler het volgende algoritme toe op binaire bewerkingen in de expressie. De onderstaande stappen zijn geen prioriteitsvolgorde.

  1. Als een van de operanden van het type long doubleis, wordt de andere operand geconverteerd naar type long double.

  2. Als niet aan de bovenstaande voorwaarde wordt voldaan en een van beide operanden van het type doubleis, wordt de andere operand geconverteerd naar type double.

  3. Als niet aan de bovenstaande twee voorwaarden wordt voldaan en een van beide operanden van het type floatis, wordt de andere operand geconverteerd naar type float.

  4. Als niet aan de bovenstaande drie voorwaarden wordt voldaan (geen van de operanden is van zwevende typen), worden integrale conversies op de operanden als volgt uitgevoerd:

    • Als een van de operanden van het type unsigned longis, wordt de andere operand geconverteerd naar type unsigned long.

    • Als niet aan de bovenstaande voorwaarde wordt voldaan en een van beide operanden van het type long is en het andere type unsigned int, worden beide operanden geconverteerd naar type unsigned long.

    • Als niet aan de bovenstaande twee voorwaarden wordt voldaan en een van beide operanden van het type longis, wordt de andere operand geconverteerd naar type long.

    • Als niet aan de bovenstaande drie voorwaarden wordt voldaan en een van beide operanden van het type unsigned intis, wordt de andere operand geconverteerd naar type unsigned int.

    • Als aan geen van de bovenstaande voorwaarden wordt voldaan, worden beide operanden geconverteerd naar type int.

De volgende code illustreert deze conversieregels:

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
                      */

Zie ook

C-operators