Обычные арифметические преобразования
Большинство операторов C выполняют преобразования типов для приведения операндов выражения к общему типу или для расширения коротких значений в соответствии с размером целого числа, используемым в машинных операциях. Преобразования, выполняемые с помощью операторов С, зависят от конкретного оператора и типа операнда или операндов. Однако многие операторы выполняют аналогичные преобразования с операндами целочисленного типа и типа с плавающей запятой. Эти преобразования называются арифметическими преобразованиями. В результате преобразования значения операнда в совместимый тип значение не меняется.
Арифметические преобразования, представленные ниже, называются обычными арифметическими преобразованиями. Эти шаги применяются только к бинарным операторам, ожидающим арифметический тип. Цель — получить общий тип, который также будет типом результата. Чтобы определить, какие преобразования выполняются на самом деле, компилятор применяет следующий алгоритм к бинарным операциям в выражении. Шаги ниже представлены не в порядке приоритета.
Если какой-либо из операндов имеет тип long double, то другой операнд преобразуется в тип long double.
Если вышеуказанное условие не выполняется и какой-либо из операндов имеет тип double, то другой операнд преобразуется в тип double.
Если два вышеуказанных условия не выполняются и какой-либо из операндов имеет тип float, то другой операнд преобразуется в тип float.
Если три вышеуказанных условия не выполняются (ни один из операндов не принадлежит типам с плавающей запятой), то целочисленные преобразования операндов выполняются следующим образом.
Если какой-либо из операндов имеет тип 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
*/