Обычные арифметические преобразования

Большинство операторов C выполняют преобразования типов для приведения операндов выражения к общему типу или для расширения коротких значений в соответствии с размером целого числа, используемым в машинных операциях. Преобразования, выполняемые с помощью операторов С, зависят от конкретного оператора и типа операнда или операндов. Однако многие операторы выполняют аналогичные преобразования с операндами целочисленного типа и типа с плавающей запятой. Эти преобразования называются арифметическими преобразованиями. Преобразование значения операнда в совместимый тип не приводит к изменению его значения.

Арифметические преобразования, представленные ниже, называются обычными арифметическими преобразованиями. Эти действия применяются только к бинарным операторам, которые предполагают арифметический тип. Цель — получить общий тип, который также будет типом результата. Чтобы определить, какие преобразования выполняются на самом деле, компилятор применяет следующий алгоритм к бинарным операциям в выражении. Шаги ниже представлены не в порядке приоритета.

  1. Если какой-либо из операндов имеет тип long double, то другой операнд преобразуется в тип long double.

  2. Если вышеуказанное условие не выполняется, а один из операндов имеет тип double , то второй операнд преобразуется в тип double .

  3. Если два вышеуказанных условия не выполняются, а один из операндов имеет тип float , то второй операнд преобразуется в тип float .

  4. Если три вышеуказанных условия не выполняются (ни один из операндов не принадлежит типам с плавающей запятой), то целочисленные преобразования операндов выполняются следующим образом.

    • Если какой-либо из операндов имеет тип unsigned long, то другой операнд преобразуется в тип unsigned long.

    • Если вышеуказанное условие не выполняется, при этом один из операндов имеет тип long , а второй — тип unsigned int , то оба операнда преобразуются в тип unsigned long .

    • Если два вышеуказанных условия не выполняются, а один из операндов имеет тип long , то второй операнд преобразуется в тип long .

    • Если три вышеуказанных условия не выполняются и какой-либо из операндов имеет тип unsigned int, то другой операнд преобразуется в тип unsigned int.

    • Если ни одно из вышеуказанных условий не соблюдается, то оба операнда преобразуются в тип int.

Эти правила преобразования демонстрируются в следующем примере.

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

См. также

Операторы в C