Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции1СемДоп.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
118 Кб
Скачать
☆

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

Преобразование типов в выражениях.

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

переменные типа char и short int преобразуются к типу int;

переменные типа float преобразуются к типу double;

если один из пары операндов имеет тип long double, другой операнд также преобразуется к long double;

если один из пары операндов имеет тип double, другой операнд также преобразуется к double;

если один из пары операндов имеет тип unsigned, другой операнд также преобразуется к unsigned;

Например, пусть имеем следующее объявление: char c; int k; float f; double d, res; и операцию присваивания res=(f+d) * (c-i). Последовательно выполняется преобразование внутри каждой пары операндов до выполнения соответствующей операции. Перед выполнением сложения переменная f преобразуется к типу double и затем суммируются переменные одинаковых типов double. Перед вычитанием с преобразуется к типу int и результат вычитания будет целым. Так как (f+d) имеет тип double, то перед умножением c-i преобразуется к типу double, и всё выражение будет иметь тип double. Так как переменная слева имеет такой же тип double, то во время присваивания преобразование типов в этом примере не выполняется (см. след. пункт).

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

Например, часто можно встретить следующую ошибку. Пусть переменная Sum используется для вычисления суммы элементов целочисленного массива размерности n. Тогда если объявить int Sum, то среднее значение по формуле Aver=Sum/n будет найдено неправильно, даже если float Aver. Почему? При делении будет отброшена дробная часть результата, так как и Sum, и n целые. Полученное целое значение будет преобразовано к типу float без восстановления отброшенной дробной части и присвоено переменной Aver. Один из способов преодолеть это — объявить float Sum. А если нам надо, чтобы в других операторах этого же блока или функции переменная Sum была целой? Тогда, оставив int Sum, записываем Aver=(float)Sum/n. В таком случае при вычислении частного произойдёт “временное” преобразование Sum из int во float, а в остальных операторах как до, так и после этого присваивания Sum будет иметь тот тип, который записан при объявлении, т. е. целый. Поэтому если, например, записать cout << Sum, то сумма будет выведена как целая величина.

Упражнение. Что будет выведено? Объяснить, какие преобразования будут выполнены в каждом из выражений.

float f=160.5; cout<<”\n(int)f/3 “<<((int)f/3)<< ” (int)f/3. “<<((int)f/3.)<<

“ f/3 ”<<(f/3)<< “ f/3. ”<<(f/3.);

Ответ. (int)f/3 53 (int)f/3. 53.3333 f/3 53.5 f/3. 53.5

Преобразование типов при присваивании.

Что получится, если в предыдущем примере res=(f+d) * (c-i); переменная res имела бы тип, отличный от double? Тогда используется следующее правило преобразования типов при присваивании: значение справа от оператора присваивания (значение выражения) преобразуется к типу переменной, стоящей слева. Если бы переменная res имела бы, например, целый тип, то в результате получилась бы целая часть выражения справа.

Пусть char c; int k; float f; double d;

При присваивании c=k в переменной c остаются младшие 8 битов переменной k.

В результате присваиваний f=c; f=k; получается целое число, преобразованное к формату с плавающей точкой.

Когда происходит преобразование из целого числа к символу, из длинного целого — к целому, из целого — к короткому целому, то старшие биты теряются.

При преобразовании из int в float или из float в double точность не увеличивается, а всего лишь меняется формат представления данных.

Упражнение. Что будет выведено? Объяснить, какие преобразования будут выполнены. Сравнить с предыдущим упражнением.

float r1, r2, r3, r4, f=160.5; r1=(int)f/3; r2=(int)f/3.; r3=f/3; r4=f/3.;

cout<<”\n(int)f/3 “<<r1<< ” (int)f/3. “<<r2<<“ f/3 ”<<r3<< “ f/3. ”<<r4;