Встроенные типы данных

Встроенные типы данных. Целые типы. Представление знака числа. Арифметическое переполнение

Любой реально существующий тип данных, каким бы сложным он ни казался на первый взгляд, представляет собой простые составляющие (базовые типы), которые, как правило, всегда присутствуют в языке программирования (отсюда и происходит название «встроенные типы данных»). Они не требуют дополнительного описания и представляются соответствующими операторами. В Object Pascal к таким составляющим относятся простые типы данных, которые, в свою очередь, делятся на:

 

- порядковые типы;

- вещественные типы;

- типы дата-время.

 

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

Вещественные представляют приближенно математические вещественные числа. Разделение типов на порядковые и вещественные несколько условно, т.к., строго говоря, вещественные тоже имеют конечное число значений. Количество значений определяется форматом внутреннего представления вещественного числа и настолько велико, что сопоставить порядковый номер с каждым значением практически невозможно.

Тип дата-время используется для хранения даты и времени.

 

Из простых типов данных порядковые - самые простые. В этих типах информацияпредставляется в виде отдельных элементов.

В Object Pascal к порядковым типам относятся:

 

- целые типы;

- символьный тип;

- логические типы;

- задаваемые пользователем перечисления;

- тип-диапазон.

 

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

Первый элемент любого порядкового типа имеет номер 0, второй элемент - номер 1 и т.д. Порядковый номер значения возвращает функция Ord():

- если х представляет собой целое значение, то порядковый номер равен самому значению. Иными словами, для целых типов Ord(x)=x.

- если х представляет собой логический тип, то функция Ord(x) возвращает положительное целое число от 0 до 1;

- если х представляет собой символьный тип, то функция Ord(x) возвращает положительное целое число от 0 до 255;

- если х представляет собой перечисляемый тип, то функция Ord(x) возвращает положительное целое число от 0 до 65535.

- если х представляет собой поддиапазон, то значение, возвращаемое функцией Ord(x), зависит от базового типа. Это связано с тем, что поддиапазон сохраняет свойства порядкового типа, от которого он образован.

 

К порядковым типам также применяются функции Pred(x) и Succ(x).

Результатом вызова функции Pred(x) является предыдущее значение порядкового типа. Другими словами, Pred(x) = Ord(x) - 1.

В свою очередь, Succ(x) возвращает следующее значение порядкового типа, т.е. Succ(x) = Ord(x) + 1.

 

Если программа будет содержать такие строки:

 

procedure TForml.BitBtnlClick(Sender: TObject);

var

ch:Char;

 

begin

ch:='с';

Pred(ch);

Succ(ch);

end;

 

то Pred(ch) вернет символ 'b', a Succ (ch) - символ 'd'.

 

По объективным причинам далее не будут рассматриваться перечисляемый тип и тип-диапазон, относящиеся к порядковым типам, т.к. они являются более развитыми элементами Object Pascal. Но оставлять их без внимания все же не следует. Поэтому мы изучим их менее подробно, чем остальные простые типы.

 

При задании перечисляемого типа программист просто явно указывает (перечисляет) все значения, которые может принимать переменная такого типа. Например, рассмотрим следующие «перечисления»:

 

TYPE Tcolor=(red, green, blue);

TDay=(Sun, Mon, Tue, Wed, Thu, Fri, Sat);

 

Здесь создаются два новых типа данных. Переменная типа Tcolor сможет принимать лишь три значения: red, green, blue, а переменная типа TDay – значения Sun, Mon, Tue, Wed, Thu, Fri, Sat. Слова red, green, blue представляют собой константы, за которыми на самом деле скрываются некоторые числовые значения. Но нам в программе гораздо удобнее работать со словами, чем с числами. Было бы очень неудобно закодировать цвета цифрами и мучительно вспоминать, что "0" – это красный цвет, а "2" – синий.

Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе - 1 и т. д. Т.е. значения в перечислимом типе упорядочены по возрастанию. Поэтому их можно сравнивать не только на равенство, но и на отношения "больше - меньше".

 

Для работы с переменными перечислимого типа предназначены следующие функции и процедуры:

 

INC(v) – записать в v следующее значение;

DEC(v) - записать в v предыдущее значение.

 

Например:

 

c:Tday;

...

c:=Mon;

INC(c); {теперь c=Tue}

 

Обратите внимание, что эти процедуры меняют значение переменных, подаваемых им на вход в качестве аргументов. Если это нежелательно, следует использовать функции:

 

PRED(v) – предыдущее значение перечислимого типа;

SUCC(v) – последующее значение перечислимого типа.

 

Например:

c1:=PRED(c); {c1=Sun}

c2:=SUCC(c); {c2=Mon}

 

Тип-диапазон является производным типом. Он базируется на некотором базовом порядковом типе (исключая тип-диапазон). Ограниченный тип, или тип-диапазон, действительно ограничивает значения переменной. Например, если в переменной day хранится число дней в месяце, то оно явно не должно превышать 31, а также быть меньше 1. Следовательно, диапазон допустимых значений этой переменной – [1..31]. Так и напишем:

 

TYPE Tdate=[1..31]

 

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

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

 

В стандартную библиотеку Object Pascal включены две функции, поддерживающие работу с типами-диапазонами:

- High(X) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная х;

- Low (X) - возвращает минимальное значение типа-диапазона, к которому принадлежит переменная х.