
- •СПбГУТ им. проф. М.А. Бонч–Бруевича Кафедра программной инженерии и вычислительной техники (ПИ и
- •1. Обработка данных. Операции
- •Обработка данных. Операции
- •Операции (15 рангов)
- •Обзор операций
- •Унарные (одноместные) операции
- •Бинарные (двуместные) операции
- •Бинарные (двуместные) операции
- •Операции
- •Бинарные (двуместные) операции
- •Бинарные (двуместные) операции. Тернарная (трёхместная) операция
- •Обзор операций
- •Операция явного преобразования типа
- •Преобразование типов операндов арифметических операций
- •Операция запятая (,)
- •2. Операторы
- •3. Выражения
- •Отношения и логические выражения
- •Выражения и операторы
- •4. Приведение типов в выражениях
- •Приведение типов в выражениях

4. Приведение типов в выражениях
Рассматривая операцию деления, мы отметили, что при делении двух целых операндов результат получается целым.
Например, значением выражения 5/2 будет 2, а не 2.5.
Для получения вещественного результата нужно выполнять деление не целых, а вещественных операндов, например, записав 5.0/2.0, получим значение 2.5.
Если операндами являются безымянные константы, то заменить целую константу (как мы только что сделали) на вещественную совсем не трудно.
В том случае, когда операндом является именованная константа, переменная или выражение в скобках, необходимо для решения той же задачи использовать операцию явного приведения (преобразования) типа.
Например, рассмотрим такой набор определений и операторов присваивания:
int n=5, k=2; double d; int m;
d=(double) n/ (double) k; /* значением d станет величина 2.5 типа double */
m=n/k; // значением переменной m станет целое значение 2
Операция деления является только одной из бинарных операций.
Почти для каждой из них операнды могут иметь разные типы.
Однако не всегда программист должен в явном виде указывать преобразования типов.
Если у бинарной операции операнды имеют разные типы (а должны в соответствии с синтаксисом выражения иметь один тип), то компилятор выполняет преобразование типов автоматически, то есть приводит оба операнда к одному типу.
Примеры:
Результат деления целочисленных операндов:
1/3 =0
Чтобы избежать ошибок необходимо явно изменять тип хотя бы одного операнда, т.е. записывать
1./3 ~ 0.333
Явное преобразование типов осуществляется, если перед выражением поставить в скобках идентификатор соответствующего типа.
Вид записи операции: (тип) выражение;
(float)1/3 ~ 0.333
Приведение типа при выполнении присваивания
При присваивании значение правой части преобразуется к типу |
|
левой, который и является типом результата. |
|
Рассмотрим преобразование int в char: |
|
char s; int j=327; s=j; |
//s=‘G’ или 71 (327 –256) |
32710 = 0x14716 = 0001 0100 01112
0100 01112 = 0x47=7110
Старший байт
float x; int i;
x=i; // тип результата float i=x; // тип результата int
Тип float преобразуется к int с отбрасыванием дробной части.
Тип double преобразуется к float с округлением.
21
Приведение типов в выражениях
Если в выражении появляются операнды различных типов, то они преобразуются к некоторому общему типу, при этом к каждому арифметическому операнду применяется такая последовательность правил:
1.Если один из операндов в выражении имеет тип long double, то остальные тоже преобразуются к типу long double.
2.В противном случае, если один из операндов в выражении имеет тип double, то остальные тоже преобразуются к типу double.
3.В противном случае, если один из операндов в выражении имеет тип float, то остальные тоже преобразуются к типу float.
4.В противном случае, если один из операндов в выражении имеет тип unsigned long, то остальные тоже преобразуются к типу unsigned long.
5.В противном случае, если один из операндов в выражении имеет тип long, то остальные тоже преобразуются к типу long.
6.В противном случае, если один из операндов в выражении имеет тип unsigned, то остальные тоже преобразуются. к типу unsigned.
7.В противном случае все операнды преобразуются к типу int. При этом тип char преобразуется в int со знаком; тип unsigned char в int, у которого старший байт всегда нулевой; тип signed char в int, у которого в знаковый разряд передается знак из сhar; тип short в int (знаковый или беззнаковый).
Предположим, что вычислено значение некоторого выражения в правой части оператора присваивания. В левой части оператора присваивания записана некоторая переменная, причем ее тип отличается от типа результата в правой части.
Здесь правила преобразования очень простые: значение справа от оператора присваивания преобразуется к типу переменной слева от оператора присваивания.
Если размер результата в правой части больше размера операнда в левой части, то старшая часть этого результата будет потеряна.
В языке Си можно явно указать тип любого выражения.
Для этого используется операция преобразования ("приведения") типа.
Она применяется следующим образом:
(тип) выражение /* здесь можно указать любой допустимый в языке Си тип */
Рассмотрим пример: int a = 30000; float b;
........
b = (float) a * 12;
(переменная a целого типа явно преобразована к типу float; если этого не сделать, то результат будет потерян, т.к.
a * 12 > 32767).
Преобразование типа также может использоваться для преобразования типов аргументов при вызове функций.
Например, оператор flag_pole = i;
разрешен, даже если i имеет тип int, а flag_pole — long.
Во многих случаях необходимо или полезно принудительно проводить преобразования между типами данных.
Для принудительного преобразования достаточно поставить целевой тип в скобках перед выражением для преобразования.
Например:
р ( (long) i);
предписывает преобразовать целое число i в long перед передачей его в качестве параметра в процедуру p, которая ожидает именно параметр long.
22

23