Sdílet prostřednictvím


Obvyklé aritmetické převody

Většina operátorů jazyka C provádí převody typů tak, aby operandy výrazu přenesly na běžný typ nebo aby rozšířily krátké hodnoty na celočíselnou velikost použitou v operacích počítače. Převody prováděné operátory jazyka C závisí na konkrétním operátoru a typu operandu nebo operandů. Mnoho operátorů však provádí podobné převody na operandy integrálních a plovoucích typů. Tyto převody se označují jako "aritmetické převody". Převod hodnoty operandu na kompatibilní typ způsobí, že se nezmění jeho hodnota.

Níže shrnuté aritmetické převody se nazývají "obvyklé aritmetické převody". Tyto kroky se použijí pouze pro binární operátory, které očekávají aritmetický typ. Účelem je získat běžný typ, který je také typem výsledku. Chcete-li zjistit, které převody skutečně proběhnou, kompilátor použije následující algoritmus na binární operace ve výrazu. Následující kroky nejsou pořadí priorit.

  1. Je-li jeden operand typu long double, druhý operand je převeden na typ long double.

  2. Pokud výše uvedená podmínka není splněna a jeden operand je typu double, druhý operand je převeden na typ double.

  3. Pokud výše uvedené dvě podmínky nejsou splněny a jeden operand je typu float, druhý operand je převeden na typ float.

  4. Pokud nejsou splněny výše uvedené tři podmínky (žádný z operandů není typu s plovoucí desetinou čárkou), pak se na operandech provádějí integrální převody následujícím způsobem:

    • Je-li jeden operand typu unsigned long, druhý operand je převeden na typ unsigned long.

    • Pokud výše uvedená podmínka není splněna a jeden operand je typu long a druhý typ unsigned int, oba operandy jsou převedeny na typ unsigned long.

    • Pokud výše uvedené dvě podmínky nejsou splněny a jeden operand je typu long, druhý operand je převeden na typ long.

    • Pokud výše uvedené tři podmínky nejsou splněny a operand je typu unsigned int, druhý operand je převeden na typ unsigned int.

    • Pokud nejsou splněny žádné z výše uvedených podmínek, oba operandy se převedou na typ int.

Následující kód ilustruje tato pravidla převodu:

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

Viz také

Operátory jazyka C