Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Большинство операторов 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
*/