Иллюстрированный самоучитель по Turbo Pascal

Совместимость и преобразование типов

Как уже неоднократно отмечалось, Турбо Паскаль – это типизированный язык. Он построен на основе строгого соблюдения концепции типов, в соответствии с которой все применяемые в языке операции определены только над операндами совместимых типов. При обсуждении операций над вещественными данными мы уже затрагивали проблему совместимости вещественных и целых типов. Аналогичные проблемы возникают при операциях над строками разной длины, строками и символами и т.д. Ниже приводится более полное определение совместимости типов.

Два типа считаются совместимыми, если:

  • оба они есть один и тот же тип;
  • оба вещественные;
  • оба целые;
  • один тип есть тип-диапазон второго типа;
  • оба являются типами-диапазонами одного и того же базового типа;
  • оба являются множествами, составленными из элементов одного и того же базового типа;
  • оба являются упакованными строками (определены с предшествующим словом 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. В гл. 6 описывается функция PTR, преобразующая четырехбайтный целочисленный аргумент к типу-указателю.

В Турбо Паскале может использоваться и более общий механизм преобразования типов, согласно которому преобразование достигается применением идентификатора имени) стандартного типа или типа, определенного пользователем, как идентификатора функции преобразования к выражению преобразуемого типа (так называемое автоопределенное преобразование типов). Например, допустимы следующие вызовы функций:

type
МуType = (а, b, с, d);
…..
МуType (2)
Integer ('D')
pointer (longint(a)+ $FF)
Char (127 mod c)
Byte (k)

При автоопределенном преобразовании типа выражения может произойти изменение длины его внутреннего представления (длина может увеличиться или уменьшиться).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.