Обычные арифметические преобразования
Большинство операторов 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
*/