Преобразование (приведение) типов и значений.
Явное преобразование (приведение) типов.
Паскаль является строго типизированным языком, но в нем имеется много средств, которые позволяют обойти все запреты, связанные с несовместимостью типов.
Тип, к которому приводится |
То, что приводится |
тип (переменная)
ПРИМЕР: l = $33 32 31 03
/> длина строки
Type
ts = String[3]; область памяти для переменной L рассматривается как строка из 3 символов
Var #3 ‘1’ ’2’ ‘3’
l : Longint ;
vs : ts; l = $33 32 31 03
Begin при l := '123'; была бы ошибка несовместимости типа
1) ts(l) := '123';
2) l := $34 33 32 02;
3) vs := ts(l); ------> vs = '23'
End. внутреннее представление переменной L рассматривается как строка
Из примера видно, что преобразование типа выполняется как слева от знака присваивания, так и справа. В первой строке преобразование типа выполняется слева от значка присваивания. При этом область памяти, отведенная под переменную l, трактуется как строка длиной 3. Известно, что эта строка занимает 4 байта. После такого присваивания переменная l получит значение l =$33323103. В этом значении 03 - текущая длина строки (младший байт). После выполнения третьей строчки программы: vs = '23'. (31 – код символа ‘1’, 32 - код символа '2’, 33 – код символа '3’, 34 – код символа '4’)
Рассмотренные преобразования типов называются преобразованием типа переменных. Преобразование типа переменной, как видно из рассмотренного примера, может находиться и в левой, и в правой части оператора присваивания. При этом тип переменной в скобках и тип, к которому выполняется приведение, должны быть совместимы в машинном представлении, т.е. занимать в памяти одно и тоже количество байт.
Имеется другой тип преобразования – преобразование типа значения. Отличие от преобразования типа переменной:
- преобразование типа значения может находиться лишь в правой части оператора присваивания;
- мы меняем не точку зрения на хранимой в памяти значение, а само внутреннее представление значения в памяти.
Форма записи преобразования типа значения такая же, как у преобразования типа переменной (аналогично вызову функции).
ПРИМЕРЫ.
1) Integer('r'); - символьное значение (занимает 1 байт) преобразовывается к целому типу (занимает 2 байта).
2) char(25)
Возможно две ситуации при таком преобразовании:
1. При приведении значения к более широкому типу значение записывается в младшие байты области памяти новой формы представления.
2. При приведении к более узкому типу преобразования переходят с потерей значения: копируются только младшие байты, а старшие байты теряются.
Есть ограничение, которое накладывается на преобразование типа значения: и приводимый тип и тип, к которому приводят, должны быть порядковыми или ссылочными(оба).
Var
s: Shortint;
Begin значение не порядкового типа, поэтому такая запись неправильна
s := Shortint( 1.28 );
End;
Данный пример является грубой семантической ошибкой. (синтаксической ошибки нет). При этом компилятором будет выдано сообщение о неправильном приведении типа: «Type cast error»
Дата добавления: 2016-05-28; просмотров: 2038;