«Ни один ремесленник, который стремится к вершинам своей профессии, не примет негодных инструментов; и ни один производитель, который ценит качество работы, не будет упрашивать ремесленника принять их»
5. Типы данных
Типы данных можно классифицировать по следующим признакам или критериям:
Ø предопределенные (встроенные) типы (predefined, built-in) и определяемые (конструируемые) пользователем или описанные в Delphi;
Ø основные (fundamental) и родовые (generic). Основные типы одинаковы (имеют одинаковый диапазон значений и размер) во всех реализациях языка Object Pascal и не зависят от процессора и платформы. Большинство предопределенных типов являются основными, а небольшая часть целочисленных, символьных, строковых и указателей являются родовыми. Родовые типы целесообразно использовать везде, где только можно, так как они обеспечивают максимальную эффективность. Вместе с тем в другой реализации компилятора могут возникнуть проблемы совместимости;
Ø типы также можно классифицировать на простые, строковые, структурные, указатели, процедурные и вариантные (simple, string, structured, pointer, procedural, or variant). Кроме того, идентификатор типа также можно считать типом, так как он может фигурировать в качестве фактического параметра (High, Low, and SizeOf).
Классификация типов Object Pascal по последнему признаку такая:
– простые (simple)
– порядковые (ordinal)
– integer
– character
– Boolean
– enumerated
– subrange
– real
– string
– structured
– set
– array
– record
– file
– class
– class reference
– interface
– pointer
– procedural
– variant
– type identifier
Стандартная функция SizeOf применима ко всем типам и переменным и возвращает занимаемый ими объем памяти в байтах.
К любому порядковому типу применимы такие стандартные процедуры и функции: High, Low, Succ, Pred, Inc, Dec.
Из целочисленных типов родовыми (generic) являются Integer и Cardinal. Их рекомендуется применять в первую очередь.
Основными типами (fundamental) являются Shortint, Smallint, Longint, Int64, Byte, Word и Longword.
Родовые целочисленные типы для 32-битной реализации Object Pascal.
Тип |
Диапазон |
Формат |
Integer |
–2147483648..2147483647 |
знаковый, 32 бита |
Cardinal |
0..4294967295 |
беззнаковый, 32 бита |
Основные целочисленные типы
Тип |
Диапазон |
Формат |
Shortint |
–128..127 |
знаковый, 8 бит |
Smallint |
–32768..32767 |
знаковый, 16 бит |
Longint |
–2147483648..2147483647 |
знаковый, 32 бита |
Int64 |
–263 ..2 63 –1 |
знаковый, 64 бита |
Byte |
0..255 |
беззнаковый, 8 бит |
Word |
0..65535 |
беззнаковый, 16 бит |
Longword |
0..4294967295 |
беззнаковый, 32 бита |
Арифметические операции над целочисленными данными возвращают значения типа Integer, которые в нынешней реализации соответствуют типу Longint. Значения типа Int64 возвращаются только в тех случаях, когда операнд имеет тип Int64. Например, следующий код даст некорректный результат (или ошибку при включенном контроле диапазона $R+)
var
I: Integer;
J: Int64;
. . .
I := High(Integer);
J := I + 1;
Для получения корректного результата надо сделать так:
J := Int64(I) + 1;
Большинство стандартных подпрограмм усекают тип Int64 до 32 бит. Тем не менее, функции High, Low, Succ, Pred, Inc, Dec, IntToStr и IntToHex полностью поддерживают аргументы типа Int64.
Основными символьными типами являются AnsiChar и WideChar. Тип AnsiChar является 8-битовым и представляет собой расширенный набор символов ANSI (extended ANSI character set). Тип WideChar является 16-битовым и соответствует символам Unicode (Unicode character set). Первые 256 символов Unicode соответствуют символам ANSI. Родовым типом является char, который эквивалентен AnsiChar. При использовании типа Char надо иметь в виду, что переход к типу Unicode не за горами и там, где это существенно, надо использовать функцию SizeOf для определения размера типа.
Стандартная функция Chr применима к AnsiChar и WideChar.
Предопределенных булевских типов четыре: Boolean, ByteBool, WordBool и LongBool. Предпочтительным является Boolean; другие типы введены для совместимости с другими языками и Windows.
Перечисляемый тип (enumerated) – интерпретируется так же, как и в BP. При выборе значений типа надо не забывать о возможности конфликта имен из-за множества идентификаторов, определенных в Delphi.
Тип–диапазон (Subrange) – интерпретируется так же, как и в BP. Использование константных выражений при определении типа может вызвать ошибку компилятора. Например, следующее описание вызовет ошибку компилятора:
const
X = 50;
Y = 10;
type
Scale = (X - Y) * 2..(X + Y) * 2;
Происходит она из-за того, что если после знака = следует открывающая круглая скобка, компилятор считает, что следует определение перечисляемого типа. Проблема может быть решена таким простым способом:
type
Scale = 2 * (X - Y)..(X + Y) * 2;
Вещественные (Real) типы. Характеристики основных (Fundamental) вещественных типов приведены в таблице.
Тип |
Диапазон |
Значащих цифр |
Размер в байтах |
Real48 |
2.9 х 10–39 .. 1.7 x 1038 |
11–12 |
6 |
Single |
1.5 x 10 –45 .. 3.4 x 10 38 |
7–8 |
4 |
Double |
5.0 x 10 –324 .. 1.7 x 10 308 |
15–16 |
8 |
Extended |
3.6 x 10 –4951 .. 1.1 x 10 4932 |
19–20 |
10 |
Comp |
–2 63 +1 .. 2 63 –1 |
19–20 |
8 |
Currency |
–922337203685477.5808.. 922337203685477.5807 |
19–20 |
8 |
Родовым (generic) типом является Real, который в текущей реализации соответствует Double. В предыдущих версиях Object Pascal тип Real был 6-байтовым, а ныне для этой цели можно использовать тип Real48. Для возврата к 6-байтовой интерпретации типа Real можно воспользоваться директивой компилятора {$REALCOMPATIBILITY ON}.
Следующие замечания относятся к основным вещественным типам:
Real48 |
предназначен для обратной совместимости и, так как его формат не свойственен процессорам Intel, его использование неэффективно; |
Extended |
предпочтительнее всех других вещественных типов, но он менее совместим с другими платформами; |
Comp |
(computational) является «родным» (native) и представляется 64-битным целочисленным типом, хотя как таковой интерпретироваться не может. Он оставлен только для обратной совместимости и вместо него лучше использовать Int64; |
Currency |
является типом с фиксированной точкой (fixed-point) и предназначен для уменьшения ошибок округления в финансовых расчетах (monetary calculations). Он представляется как масштабированный 64-битный целочисленный тип с четырьмя младшими цифрами, которые представляют десятичные разряды неявным образом. При смешении с другими вещественными типами Currency автоматически умножается или делится на 10000. |
«4. Синтаксические элементы языка»
6. Строковые типы данных