Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
342
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

Приведение типов.

Приведение типов. Рассматривая операцию деления, мы отметили, что при делении двух целых операндов результат получается целым. Например, значением выражения 5/2 будет 2, а не 2.5. Для получения вещественного результата нужно выполнять деление не целых, а вещественных операндов, например, записав 5.0/2.0, получим значение 2.5.

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

В этом фрагменте значением d станет величина 2.5 типа double, а значением переменной m станет целое значение 2.

Операция деления является только одной из бинарных операций. Почти для каждой из них операнды могут иметь разные типы. Однако не всегда программист должен в явном виде указывать преобразования типов. Если у бинарной операции операнды имеют разные типы (а должны в соответствии с синтаксисом выражения иметь один тип), то компилятор выполняет преобразование типов автоматически, т.е. приводит оба операнда к одному' типу. Например, для тех же переменных значение выражения d+k будет иметь тип double за счет неявного преобразования, выполняемого автоматически без указания программиста. Рассмотрим правила, по которым такие приведения выполняются.

Правила преобразования типов

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

Правила преобразования в языке Си для основных типов определены стандартом языка. Эти стандартные преобразования включают перевод "низших" типов в "высшие".

Среди преобразований типов выделяют:

• преобразования в арифметических выражениях;

• преобразования при присваиваниях;

• преобразования указателей.

Преобразование типов указателей будет рассмотрено в главе 4. Здесь рассмотрим преобразования типов при арифметических операциях и особенности преобразований типов при присваиваниях.

При преобразовании типов нужно различать преобразования, изменяющие внутреннее представление данных, и преобразования изменяющие только интерпретацию внутреннего представления. Например, когда данные типа unsigned int переводятся в тип int, менять их внутреннее представление не требуется - изменяется только интерпретация. При преобразовании значений типа float в значение типа int недостаточно изменить только интерпретацию, необходимо изменить длину участка памяти для внутреннего представления и кодировку. При таком преобразовании из float в int возможен выход за диапазон допустимых значений типа int, и реакция на эту ситуацию существенно зависит от конкретной реализации. Именно поэтому для сохранения мобильности программ в них рекомендуется с осторожностью применять преобразование типов.

Рассмотрим последовательность выполнения преобразования операндов в арифметических выражениях.

1. Все короткие целые типы преобразуются в типы не меньшей длины в соответствии с табл. 1.5. Затем оба значения, участвующие в операции, принимают одинаковый тип в соответствии со следующими ниже правилами.

2. Если один из операндов имеет тип long double, то второй тоже будет преобразован в long double.

3. Если п. 2 не выполняется и один из операндов есть double, другой приводится к типу double.

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

5. Если п. 2 - 4 не выполняются (оба операнда целые) и один операнд unsigned long int, то оба операнда преобразуются к типу unsigned long int.

6. Если п. 2 - 5 не выполняются и один операнд есть long, другой преобразуется к типу long.

7. Если п. 2 - 6 не выполняются и один операнд unsigned, то другой преобразуется к типу unsigned.

8. Если п. 2 - 7 не выполнены, то оба операнда принадлежат типу int.

Таблица 1.5