Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Тип результата арифметических выражений.



С вопросом совместимости типов непосредственно связан вопрос о типе результата арифметического выражения, если в этом выражении смешаны разные целые типы. Например, при данных объявлениях.

Пусть надо выполнить:

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) Тип результата выражения в правой части оператора присваивания формируется независимо от типа той переменной, которая находится в левой части оператора присваивания.

 
 
R: = B * I + W;


- - общий тип для выражения справа - 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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.021 с.)
Главная | Случайная страница | Обратная связь