Преобразования типов

Преобразование переменной одного типа в переменную другого типа является типизированием. mikroPascal PRO для ARM поддерживает как неявные, так и явные преобразования для встроенных типов.

Неявное преобразование

Компилятор обеспечит автоматическое неявное преобразование в следующих ситуациях:

Принцип преобразования

Когда операнды имеют разные типы, неявное преобразование способствует более сложному типу для более сложного типа, делая следующие шаги:

bit       →  byte/char
byte/char →  word
short     →  integer
short     →  longint
integer   →  longint
integer   →  real

Более высокие байты расширенного неподписанного операнда заполняются нулями. Более высокие байты расширенного подписанного операнда заполняются знаком бита (если число отрицательное, заполнять более высокие байты одним, иначе - нулями). Например:

var a : byte; b : word;
...
a := $FF;
b := a;  // a is promoted to word, b becomes $00FF

Вырезка

В присваиваниях и операторах, для которых требуется выражение определенного типа, адресат будет хранить правильное значение только в том случае, если он может правильно представить результат выражения, т. е. если результат соответствует диапазону назначения.

Если выражение оценивается более сложным типом, чем ожидалось, избыток данных будет просто отсечен (высшие байты будут потеряны).

var i : byte; j : word;
//...
j := $FF0F;
i := j;   // i becomes $0F, higher byte $FF is lost

Явное преобразование

Явное преобразование может быть выполнено в любой момент, вставив ключевое слово типа (байт, слово, короткий, целочисленный, длинный или реальный) перед выражением, которое нужно преобразовать. Выражение должно быть заключено в круглые скобки. Явное преобразование может выполняться только с правом операнда оператора присваивания.

Особым случаем является преобразование между подписанными и неподписанными типами. Явное преобразование между подписанными и неподписанными данными не изменяет двоичное представление данных - оно просто позволяет копировать источник в пункт назначения.

Например:

var a : byte; b : short;
...
b := -1;
a := byte(b);  // a is 255, not 1

// Это связано с тем, что двоичное представление остается
// 11111111; теперь это просто интерпретируется по-другому

Вы не можете выполнить явное преобразование в операнде слева от оператора присваивания:

word(b) := a;   // Компилятор сообщит об ошибке

Примеры преобразований

Вот пример преобразования:

program test;

type TBytePtr = ^byte;

var arr: array[10] of word;
    ptr : TBytePtr;

var a, b, cc : byte;
          dd : word;

begin
  a := 241;
  b := 128;

  cc  := a + b;        // equals 113
  cc  := word(a + b);  // equals 113
  dd  := a + b;        // equals 369

  ptr := TBytePtr(@arr);
  ptr := ^byte(@arr);
end.