Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Тип результата арифметических выражений.
С вопросом совместимости типов непосредственно связан вопрос о типе результата арифметического выражения, если в этом выражении смешаны разные целые типы. Например, при данных объявлениях. Пусть надо выполнить: Var R: real; B: byte; I: integer; W: word; Begin …………. R: = B * I + W; ................ В данном случае, не зная определенных правил, трудно предсказать тип результата (что будет присвоено R).
На этот случай существуют правила внутреннего преобразования результата арифметического выражения: 1) в случае бинарной (двухмерной) операции над целыми операндами оба операнда преобразуются к так называемому общему типу. 2) действия (для целых операндов) выполняются над данными общего типа, и результат получается общего типа. 3) Общим типом для двух разных целых чисел является целый тип с наименьшим диапазоном, охватывающим диапазон возможных значений обоих операндов. При этом: · Для Integer и Byte общим типом будет Integer. · Для Integer и Shortint будет Integer. · Для Integer и Word общим типом будет тип, который охватывает диапазон их значений (в отрицательной области Integer не охватывает Word, в положительной Word не охватывает Integer). Для них общим типом будет Longint. 4) Если в бинарной операции смешиваются целые и вещественные типы, то целый операнд автоматически преобразуется в операнд вещественного типа и результат также получается вещественного типа. Вычисления производятся над операндами типа extended, а результат округляется до нужной ширины вещественного типа. 5) Тип результата выражения в правой части оператора присваивания формируется независимо от типа той переменной, которая находится в левой части оператора присваивания.
- - общий тип для выражения справа - Longint При выполнении присваивания значения выражения типа Longint переменной другого целого типа возможно две ситуации: 1). Когда тип выражения справа от знака присваивания " вписывается " в тип переменной, которая слева (от знака присваивания) 2). Когда тип выражения справа (от знака присваивания) не вписывается в тип переменной, которая слева от знака присваивания. Для присваивания B: = A; слова тип переменной А " вписывается " в тип переменной В означает, что диапазон возможных значений типа переменной А меньше или равен диапазону возможных значений типа переменной В. Если выражение справа от знака присваивания имеет тип результата, который не вписывается в тип переменной, которая слева от знака присваивания, то преобразование (значения выражения справа к типу переменной слева) происходит с потерей информации (если присваивается один целый тип другому целому типу, то теряются старшие байты).
8.3 Преобразование (приведение) типов и значений. 8.3.1 Явное преобразование (приведение) типов. Паскаль является строго типизированным языком, но в нем имеется много средств, которые позволяют обойти все запреты, связанные с несовместимостью типов.
тип (переменная)
ПРИМЕР: 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» 8.3.2 Неявное преобразование или приведение типов. Это преобразование типа происходит без явного указания на его необходимость. Преобразование происходит в следующих случаях: 1. При выполнении арифметических операций над целочисленными операндами преобразование происходит к т.н. общему типу в бинарных операциях. 2. В арифметических операциях смешаны целые и вещественные. Происходит преобразования целых в вещественные. 3. Одна и та же область памяти в программе переменно (в разные моменты времени) трактуется как значения разных типов. Рассмотрим подробнее 3-ий случай. Совмещение разнотипных данных в памяти возможно a) в случае использования вариантных записей b) при использовании нескольких разных т.н. типизированных указателей на один и тот же адрес (в этом случае у одной и той же области памяти будет несколько синонимов). c) когда явно указывается необходимость совмещения разных значений в памяти с использованием ключевого слова absolute. За этим словом может указываться либо физический адрес области памяти, в которой совмещают разные значения, либо имя переменной, с которой надо совместить другую. ПРИМЕР. Var s: String; b: Byte absolute s; Begin s: = '12345'; b: = 2; ------> s =? End. Такое совмещение дает в памяти следующую картину: адрес размещения
#5 '1' '2' '3' '4' '5' переменная s 2 переменная b Переменная b занимает тот же самый байт в памяти, что и младший байт переменной s. Исходя из того, что младший байт строки S отведен под длину, то новое значение строки s = '12'. То же действие может быть произведено с помощью S[0]: =#2;
Популярное:
|
Последнее изменение этой страницы: 2016-07-12; Просмотров: 662; Нарушение авторского права страницы