Conversioni aritmetiche comuni
La maggior parte degli operatori C eseguono conversioni di tipi per impostare gli operandi di un'espressione a un tipo comune o per estendere valori short nella dimensione dell'Integer utilizzata nelle operazioni del computer. Le conversioni eseguite dagli operatori C dipendono dall'operatore specifico e dal tipo di operando o di operandi. Tuttavia, molti operatori eseguono conversioni simili su operandi di tipi integrali e a virgola mobile. Queste conversioni sono note come "conversioni aritmetiche". La conversione di un valore operando in un tipo compatibile non comporta alcuna modifica al relativo valore.
Le conversioni aritmetiche riepilogate di seguito sono denominate "conversioni aritmetiche consuete". Questi passaggi vengono applicati solo per gli operatori binari che prevedono un tipo aritmetico. Lo scopo è quello di produrre un tipo comune che è anche il tipo del risultato. Per determinare quali conversioni vengono effettivamente eseguite, il compilatore applica l'algoritmo seguente alle operazioni binarie nell'espressione. I passaggi riportati di seguito non sono in un ordine di precedenza.
Se uno degli operandi è di tipo
long double
, l'altro operando verrà convertito nel tipolong double
.Se la condizione precedente non viene soddisfatta e uno degli operandi è di tipo
double
, l'altro operando viene convertito in tipodouble
.Se le due condizioni precedenti non vengono soddisfatte e uno degli operandi è di tipo
float
, l'altro operando viene convertito in tipofloat
.Se le tre condizioni precedenti non vengono soddisfatte (nessuno degli operandi è di tipo a virgola mobile), le conversioni integrali verranno eseguite sugli operandi come segue:
Se uno degli operandi è di tipo
unsigned long
, l'altro operando verrà convertito nel tipounsigned long
.Se la condizione precedente non viene soddisfatta e uno degli operandi è di tipo
long
e l'altro di tipounsigned int
, entrambi gli operandi vengono convertiti in tipounsigned long
.Se le due condizioni precedenti non vengono soddisfatte e uno degli operandi è di tipo
long
, l'altro operando viene convertito in tipolong
.Se le tre condizioni precedenti non vengono soddisfatte e uno degli operandi è di tipo
unsigned int
, l'altro operando verrà convertito nel tipounsigned int
.Se nessuna delle condizioni precedenti viene soddisfatta, entrambi verranno convertiti nel tipo
int
.
Nell'esempio di codice seguente vengono illustrate queste regole di conversione:
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
*/