![](/user_photo/_userpic.png)
Программная инженерия. 1 курс 1 семестр / Лекции / L-05.Operatoriinstrykciiivirajeniya
.pdf![](/html/88974/250/html_9Daz00NqrY.AZDn/htmlconvd-edQjt721x1.jpg)
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 |
|
![](/html/88974/250/html_9Daz00NqrY.AZDn/htmlconvd-edQjt723x1.jpg)
23