Скачиваний:
2
Добавлен:
03.01.2024
Размер:
1.86 Mб
Скачать

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

Соседние файлы в папке Лекции