Совместимость и преобразование типов данныхРефераты >> Программирование и компьютеры >> Совместимость и преобразование типов данных
Примеры:
1. ORD(‘R’)=82; ORD(5)=5;
2. CHR(68)=’D’; можно вызывать эту функцию через #, если аргумент функции константа (#68='D');
3. PRED(‘N’)=’M’; PRED(87)=86;
4. SUCC(‘S’)=’T’; SUCC(87)=88;
5. PI=3.141592653897932385;
6. ROUND(3.1415)=3;
7. LN(1)=0.000;
8. SQRT(36)=6.000;
9. SIN(90*pi/180)=1.000.
Замечание:
В тригонометрических функциях аргумент должен быть задан только в радианной мере угла.
Совместимость и преобразование типов данных.
Турбо-Паскаль - типизированный язык, следовательно, все применяемые операции определены только над операндами совместимых типов.
Два типа считаются совместимыми, если
- оба они есть один и тотже тип.
- один тип есть тип-диапазон второго типа.
- оба они являются типами-диапазонами одного и того же базового типа.
- один тип есть строка, а другой - строка или символ.
- оба они есть процедурные типы с одинаковым типом результата (для типа-функции), одинаковым количеством параметров и одинаковым типом взаимно соответствующих параметров.
Когда в тех или иных операциях или операторах присутствуют данные, относящиеся к различным типам, возникает вопрос о совместимости типов. В связи с этим говорят об идентичности типов, совместимости типов и совместимости типов для присваивания. Когда возникают проблемы с соответствием типов данных, можно осуществить преобразование тех или иных типов.
Идентичность типов.
Идентичность типов требуется от формальных параметров процедур и функций и соответствующих им фактических параметров во время вызова. Два типа Т1 и Т2 идентичны в следующих случаях:
T1 и Т2 – один и тот же идентификатор типа (integer; real и т.д. и т.п.);
Один тип объявляется эквивалентным другому.
type T1 = boolean; T2 = T1; T3 = boolean; M1 = array [1 5] of integer; M2 = array [1 5] of integer; var V1, V2 = array [1 10] of integer; Так, типы Т1, Т2, Т3 и boolean – идентичны, а М1 и М2 – не идентичные типы, но тем не менее, переменные V1 и V2 – переменные идентичных типов.
Совместимость типов.
Совместимость типов требуется в выражениях (в том числе и в операциях отношения). Два типа Т1 и Т2 идентичны в следующих случаях:
Т1 и Т2 – один и тот же тип или они идентичны;
Т1 и Т2 – вещественные типы;
Т1 и Т2 – целые типы;
Один тип – вещественный, а другой – целый;
Один тип представляет собой тип – диапазон другого;
Оба типа являются типами – диапазонами какого-то одного типа;
Оба типа являются типами – множествами с совместимыми базовыми типами;
Один тип является строкой, а другой – символом или строкой.
Совместимость для присваивания.
Эта совместимость необходима, когда значение какого-то выражения присваивается переменной, типизированной константе или функции. Если значение объекта типа Т2 присваивается объекту типа Т1, то это возможно в следующих случаях:
Т1 и Т2 – идентичные типы и не являются файловыми типами или структурированными типами, содержащими компоненты файлового типа на любом уровне структурированности;
Т1 и Т2 – совместимые порядковые типы и значение типа Т2 находится в границах возможных значений объекта типа Т1;
Т1 и Т2 – вещественные типы и значение типа Т2 находится в границах возможных значений объекта типа Т1;
Т1 – вещественный тип, а Т2 – целый;
Т1 и Т2 – строки;
Т1 – строка, а Т2 – символ;
Т1 и Т2 – совместимые типы – множества и все компоненты значения типа Т2 находятся в множестве Т1.
Преобразование типов в Паскале может быть явным и неявным. При явном преобразовании типов используются вызовы специальных функций Ord, Trunc, Round, Chr, Ptr (преобразует четырёхбайтный целочисленный аргумент к типу-указателю), аргументы которых принадлежат одному типу, а результат другому.
Преобразование может достигаться применением идентификатора (имени) стандартного типа, или определённого пользователем типа, в качестве идентификатора функции преобразования к выражению преобразуемого типа (так называемое автоопределённое преобразование типов). Например, допустимы следующие вызовы функций:
Type Mytype = (A, B, C, D);
. . . . . . . . . . . . . . . . .
Mytype (2);
Integer (D);
Pointer (Longint (A) + $FF);
Char (127 Mod C);
Byte (K);
При автоопределённом преобразовании типа выражения может произойти изменение длины его внутреннего представления (уменьшение или увеличение).
В Турбо-Паскале есть ещё один явный способ: в ту область памяти, которую занимает переменная некоторого типа, можно поместить значение выражения другого типа, если только длина внутреннего представления вновь размещаемого значения в точности равна длине внутреннего представления переменной. С этой целью вновь используется автоопределённая функция преобразования типов, но уже в левой части оператора присваивания:
Type
Byt = Array [1 2] Of Byte;
Int = Array [1 2] Of Integer;
Rec = Record
X: Integer;
Y: Integer;
End;
Var
VByt: Byt;
VInt: Int;
VRec: Rec;
Begin
Byt (VInt[1])[2]:= 0;
Int (VRec)[1]:= 256;
End.
Данные одного типа могут автоматически (неявно) преобразовываться в данные другого типа перед выполнением операций выражений.
Неявное преобразование типов возможно только в двух случаях:
- выражение из целых и вещественных приводится к вещественным
- одна и та же область памяти трактуется попеременно как содержащая данные то одного, то другого типа.
Совмещение данных может произойти при использовании записей с вариантами, типизированных указателей, содержащих одинаковый адрес, а также при явном размещении данных разного типа в одной области памяти (используется Absolute - за ним помещается либо абсолютный адрес, либо идентификатор ранее определённой переменной).
Абсолютный адрес - пара чисел, разделённых двоеточием - первое - сегмент, второе - смещение. Пример: B: Byte Absolute $0000:$0055;
W: Longint Absolute 128:0;
Если за Absolute указан идентификатор переменной, то происходит совмещение в памяти данных разного типа, причём первые байты внутреннего представления данных будут располагаться по одному и тому же абсолютному адресу:
Var
X: Real;
Y: Array [1 3] Of Integer Absolute X;
Эквивалентность типов
Относительно понятия эквивалентности типов существует несколько точек зрения. Рассмотрим три из них. Все они исходят из того, что эквивалентные типы должны допускать одинаковые последовательности операций.
Структурная эквивалентность
Два атрибута типа T1 и T2 называются (структурно) эквивалентными, если
- их базовые типы BT1 и BT2, соответственно, совпадают или
- BT1=arr(M,N,T1'), BT2=arr(M,N,T2') и T1' эквивалентен T2', или
- BT1=rec([F1:T11, .,Fn:T1n]), BT2=rec([F1:T21, .,Fn:T2n]) и T1i эквивалентен T2i для каждого i, или
- BT1=ref(T1'), BT2=ref(T2') и T1' эквивалентен T2' и
- предположение об эквивалентности T1 и T2 не противоречит условиям 1-4.