Conversioni aritmetiche comuniUsual Arithmetic Conversions

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.Most C operators perform type conversions to bring the operands of an expression to a common type or to extend short values to the integer size used in machine operations. Le conversioni eseguite dagli operatori C dipendono dall'operatore specifico e dal tipo di operando o di operandi.The conversions performed by C operators depend on the specific operator and the type of the operand or operands. Tuttavia, molti operatori eseguono conversioni simili su operandi di tipi integrali e a virgola mobile.However, many operators perform similar conversions on operands of integral and floating types. Queste conversioni sono note come "conversioni aritmetiche".These conversions are known as "arithmetic conversions." La conversione di un valore operando in un tipo compatibile non comporta alcuna modifica al valore.Conversion of an operand value to a compatible type causes no change to its value.

Le conversioni aritmetiche riepilogate di seguito vengono definite "conversioni aritmetiche comuni".The arithmetic conversions summarized below are called "usual arithmetic conversions." Questi passaggi si applicano solo agli operatori binari che prevedono il tipo aritmetico.These steps are applied only for binary operators that expect arithmetic type. Lo scopo è quello di produrre un tipo comune che è anche il tipo del risultato.The purpose is to yield a common type which is also the type of the result. Per determinare quali conversioni vengono effettivamente eseguite, il compilatore applica l'algoritmo seguente alle operazioni binarie nell'espressione.To determine which conversions actually take place, the compiler applies the following algorithm to binary operations in the expression. I passaggi riportati di seguito non sono in un ordine di precedenza.The steps below are not a precedence order.

  1. Se uno degli operandi è di tipo long double, l'altro operando verrà convertito nel tipo long double.If either operand is of type long double, the other operand is converted to type long double.

  2. Se la condizione precedente non viene soddisfatta e uno degli operandi è di tipo double, l'altro operando verrà convertito nel tipo double.If the above condition is not met and either operand is of type double, the other operand is converted to type double.

  3. Se le due condizioni precedenti non vengono soddisfatte e uno degli operandi è di tipo float, l'altro operando verrà convertito nel tipo float.If the above two conditions are not met and either operand is of type float, the other operand is converted to type float.

  4. 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:If the above three conditions are not met (none of the operands are of floating types), then integral conversions are performed on the operands as follows:

    • Se uno degli operandi è di tipo unsigned long, l'altro operando verrà convertito nel tipo unsigned long.If either operand is of type unsigned long, the other operand is converted to type unsigned long.

    • Se la condizione precedente non viene soddisfatta e uno degli operandi è di tipo long e l'altro operando è di tipo unsigned int, entrambi gli operandi verranno convertiti nel tipo unsigned long.If the above condition is not met and either operand is of type long and the other of type unsigned int, both operands are converted to type unsigned long.

    • Se le due condizioni precedenti non vengono soddisfatte e uno degli operandi è di tipo long, l'altro operando verrà convertito nel tipo long.If the above two conditions are not met, and either operand is of type long, the other operand is converted to type long.

    • Se le tre condizioni precedenti non vengono soddisfatte e uno degli operandi è di tipo unsigned int, l'altro operando verrà convertito nel tipo unsigned int.If the above three conditions are not met, and either operand is of type unsigned int, the other operand is converted to type unsigned int.

    • Se nessuna delle condizioni precedenti viene soddisfatta, entrambi verranno convertiti nel tipo int.If none of the above conditions are met, both operands are converted to type int.

    Nell'esempio di codice seguente vengono illustrate queste regole di conversione:The following code illustrates these conversion rules:

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

Vedere ancheSee Also

Operatori CC Operators