Поделиться через


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

Многие бинарные операторы (рассмотренные в разделе Выражения с бинарными операторами) приводят к преобразованиям операндов и выдают результаты таким же образом. Способ, посредством которого эти операторы вызывают преобразования, называется обычными арифметическими преобразованиями. Арифметические преобразования операндов различных собственных типов выполняются согласно описанию в следующей таблице. Типы typedef ведут себя в соответствии со своими базовыми собственными типами.

Условия для преобразования типов

Выполненные условия

Преобразование

Один из операндов является операндом типа long double.

Другой операнд преобразуется в тип long double.

Предыдущее условие не выполнено и один из операндов является операндом типа double.

Другой операнд преобразуется в тип double.

Предыдущие условия не выполнены и один из операндов является операндом типа float.

Другой операнд преобразуется в тип float.

Предыдущие условия не выполнены (ни один из операндов не является операндом с плавающей запятой).

Для операндов выполняются восходящие приведения целого типа следующим образом.

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

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

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

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

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

В следующем коде демонстрируются правила преобразования, описанные в таблице.

// arithmetic_conversions.cpp
double dVal;
float fVal;
int iVal;
unsigned long ulVal;

int main() {
   // iVal converted to unsigned long
   // result of multiplication converted to double
   dVal = iVal * ulVal;

   // ulVal converted to float
   // result of addition converted to double
   dVal = ulVal + fVal;
}

Первый оператор в приведенном выше примере представляет умножение двух целочисленных типов, iVal и ulVal. Условие выполнено, т. е. ни один из операндов не является операндом типа с плавающей запятой и один операнд имеет тип unsigned int. Следовательно, другой операнд, iVal, преобразуется в тип unsigned int. Результат присваивается переменной dVal. Условие выполнено, т. е. один операнд имеет тип double; поэтому результат unsigned int умножения преобразуется в тип double.

Второй оператор в предыдущем примере представляет сложение переменных типа float и целого типа, fVal и ulVal. Переменная ulVal преобразуется в тип float (третье условие в таблице). Результат сложения преобразуется в тип double (второе условие в таблице) и присваивается переменной dVal.

См. также

Ссылки

Стандартные преобразования