Турбо Паскаль – это типизированный язык. Он построен на основе строгого соблюдения концепции типов, в соответствии с которой все применяемые в языке операции определены только над операндами совместимых типов. Ниже приводится более полное определение совместимости типов.
Два типа считаются совместимыми, если:
· оба они есть один и тот же тип;
· оба вещественные;
· оба целые;
· один тип есть тип-диапазон второго типа;
· оба являются типами-диапазонами одного и того же базового типа;
· оба являются множествами, составленными из элементов одного и того же базового типа;
· оба являются упакованными строками (определены с предшествующим словом PACKED) одинаковой максимальной длины;
· один тип есть тип-строка, а другой – тип-строка, упакованная строка или символ;
· один тип есть любой указатель, а другой – нетипизированный указатель;
· один тип есть указатель на объект, а другой – указатель на родственный ему объект;
· оба есть процедурные типы с одинаковыми типом результата (для типа-функции), количеством параметров и типом взаимно соответствующих параметров.
Совместимость типов приобретает особое значение в операторах присваивания. Пусть T1 – тип переменной, а Т2 – тип выражения, т.е. выполняется присваивание T1 := T2. Это присваивание возможно в следующих случаях:
· T1 и T2 есть один и тот же тип и этот тип не относится к файлам или массивам файлов, или записям, содержащим поля-файлы, или массивам таких записей;
· T1 и T2 являются совместимыми порядковыми типами и значение T2 лежит в диапазоне возможных значений T1;
· T1 и T2 являются вещественными типами и значение T2 лежит в диапазоне возможных значений T1;
· T1 - вещественный тип и T2 - целый тип; ,
· T1 - строка и T2 – символ;
· T1 - строка и T2 – упакованная строка;
· T1 и T2 – совместимые упакованные строки;
· T1 и T2 – совместимые множества и все члены T2 принадлежат множеству возможных значений T1;
· T1 и T2 – совместимые указатели;
· T1 и T2 – совместимые процедурные типы;
· T1 – объект и T2 – его потомок.
В программе данные одного типа могут преобразовываться в данные другого типа. Такое преобразование может быть явным или неявным.
При явном преобразовании типов используются вызовы специальных функций преобразования, аргументы которых принадлежат одному типу, а значение – другому. Таковыми являются уже рассмотренные функции ORD, TRUNC, ROUND, CHR.
Неявное преобразование типов возможно только в двух случаях:
· в выражениях, составленных из вещественных и целочисленных переменных, последние автоматически преобразуются в вещественный тип, и все выражение в целом приобретает вещественный тип;
· одна и та же область памяти попеременно трактуется как содержащая данные то одного, то другого типа (совмещение в памяти данных разного типа).
Совмещение данных в памяти может произойти при использовании записей с вариантными полями, типизированных указателей, содержащих одинаковый адрес, а также при явном размещении данных разного типа по одному и тому же абсолютному адресу. Для размещения переменной по нужному абсолютному адресу она описывается с последующей стандартной директивой ABSOLUTE, за которой помещается либо абсолютный адрес, либо идентификатор ранее определенной переменной. Абсолютный адрес указывается парой чисел типа WORD, разделенных двоеточием; первое число трактуется как сегмент, второе – как смещение адреса. Например:
b : Byte absolute $0000:$0055; w : Longlnt absolute 128:0;
Если за словом ABSOLUTE указан идентификатор ранее определенной переменной, то происходит совмещение в памяти данных разного типа, причем первые байты внутреннего представления этих данных будут располагаться по одному и тому же абсолютному адресу, например:
var
х : Real;
у : array [1..3] of Integer absolute x;
В этом примере переменные X и Y будут размещены, начиная с одного и того же абсолютного адреса. Таким образом, одну и ту же область памяти длиной 6 байт, а следовательно, и размещенные в этой области данные теперь можно рассматривать как данные либо типа REAL, либо как массив из трех данных типа INTEGER.
Неявные преобразования типов могут служить источником трудно обнаруживаемых ошибок в программе, поэтому везде, где это возможно, следует избегать их [8,9].