Данные простого типа
–
это
символы, числа и т.п. элементы, дальнейшее дробление которых не имеет
смысла. Из элементарных данных формируются структуры (сложные типы)
данных.
Все эти типы,
кроме вещественных, относятся к порядковым типам.
Порядковые
типы делятся на стандартные и пользовательские (перечисляемые,
интервальные).
Порядковые типы
характеризуется следующими свойствами:
-
Множество
допустимых значений любого порядкового типа представляет собой упорядоченную
последовательность, каждый элемент которого имеет свой порядковый номер.
Порядковый номер представляется целым числом. Первое значение любого
порядкового типа имеет порядковый номер 0, следующее значение имеет
порядковый номер 1 и т.д. Исключение составляет порядковый тип
Integer. Порядковым номером значения этого типа
является само значение.
-
К любому
значению порядкового типа можно применить стандартную функцию
Ord, возвращающий порядковый номер этого значения.
-
К любому
значению порядкового типа можно применить стандартную функцию
Pred, возвращающую значение, предшествующее этому значению. Исключение
составляет первое значение.
-
К любому
значению порядкового типа можно применить стандартную функцию
Succ, возвращающую значение, следующее за указанным. Исключение
составляет последнее значение.
Целый тип (integer)
Термин целый (или целочисленный) употребляется в обычном
смысле.
Значениями целого типа являются элементы подмножества целых чисел, границы
которого зависят от реализации языка. Константы с именами
MAXINT и
MAXLongINT хранят значение наибольшего целого
соответственного типа Integer и
Longint.
Так как целые числа в программах чаще всего используются в качестве значений
различного рода счетчиков (например, число повторений циклов) и значений
индексов, то ограниченный диапазон допустимых целых чисел обычно не приводит к
трудностям при программировании. Считается, что целые числа (в отличие от
действительных чисел) в любой вычислительной системе должны представляться точно
(т.е. в записи целого числа не может быть десятичной точки) и все определенные
над ними операции также должны выполняться точно.
В Паскале определены несколько целых типов данных, отличающихся длиной и
наличием знака: старший двоичный разряд либо воспринимается как знаковый, либо
является обычным разрядом числа.
ТИП |
НАЗВАНИЕ |
РАЗМЕР |
ЗНАК |
ДИАПАЗОН ЗНАЧЕНИЙ |
Intеger |
Целое |
2 байта |
Есть |
-32768 .. 32767 (-215 .. 215-1) |
Shortint |
Короткое целое |
1 байт |
Есть |
-128 .. 127 (-27 .. 27-1) |
Byte |
Байт |
1 байт |
Нет |
0 .. 255 (0 .. 28-1) |
Word |
Слово |
2 байта |
Нет |
0 .. 65535 (0 .. 216-1) |
Longint |
Длинное целое |
4 байта |
Есть |
-2147483648 .. 2147483647 (-231 .. 231-1) |
Над целочисленными значениями в Паскале определены 5 основных операций,
результатом которых является также целое число. Этими операциями являются:
сложение (+), вычитание
(-), умножение (*), целочисленное деление (DIV)
и остаток от целочисленного деления (MOD).
ЗНАК |
НАЗВАНИЕ |
+ |
сложение |
- |
вычитание |
* |
умножение |
div |
деление целочисленное |
mod |
остаток от целочисленного деления |
К целым величинам можно также применять операции отношения. Результат этих
операций имеет логический тип.
НАПРИМЕР, результатом сравнения 3<8
будет значение true.
Кроме того, к целым величинам можно применять поразрядные операции
and, or,
xor и not. При выполнении этих
операций каждая величина представляется как совокупность двоичных разрядов.
Действие выполняется над каждой парой соответствующих разрядов операндов: первый
разряд с первым, второй - со вторым и т. д .
НАПРИМЕР, результатом операции
3 and 2 будет 2.
Для работы с целыми величинами предназначены также и операции сдвига влево
shl
и вправо shr. Слева от знака операции
указывается, с какой величиной будет выполняться операция, а справа - на какое
число двоичных разрядов требуется сдвинуть величину.
НАПРИМЕР, результатом операции 12
shr 2 будет значение 3, поскольку
двоичное представление числа 12 - 11002. Выполнив операцию 12
shl 1, т. е. сдвинув это число влево на 1
разряд, получим 24. Освободившиеся при сдвиге влево разряды заполняются
нулями, а при сдвиге вправо - знаковым разрядом.
Логический тип (boolean)
В языке Паскаль имеется две константы логического типа: true
(истина) и false (ложь).
Поэтому множество возможных значений переменных типа Boolean,
ByteBool, WordBool, LongBool (логических переменных) состоит из двух
значений. Этот тип определен так, что false < true
(упорядоченность), причем
эти логические значения имеют порядковые номера 0 и 1 соответственно.
При внутреннем представлении переменные типа переменных типа
Boolean, ByteBool занимают 1 байт памяти; типа переменных типа
WordBool - 2 байта, типа LongBool - 4 байта.
Переменные типа ByteBool, WordBool, LongBool
введены только для того, чтобы обеспечить совместимость Turbo
Pascal с другими языками программирования и средой
Windows.
Над данными логического типа могут выполняться следующие операции:
-
Логические
-
not -
логическое отрицание, "не" - является унарной операцией, то есть
имеет один операнд, который и инвертирует.
-
and -
логическое умножение (конъюнкция), "и", ее результат имеет значение
true, если только оба операнда имеет значение
true.
-
or - логическое сложение (дизъюнкция), "или",
ее результат имеет значение true, если хотя бы один из
операндов имеет значение true.
-
xor - "исключающее или", ее
результат истинный, когда значения операндов не совпадают.
ОПЕРАЦИЯ |
НАИМЕНОВАНИЕ |
not |
логическое НЕ |
and |
логическое И |
or |
логическое ИЛИ |
xor |
логическое исключающее ИЛИ |
-
Операции сравнения
(равно "=" и неравно "<>")
Литерный тип (char)
Литерный тип обозначается именем
char (от слова character
- символ, знак).
Значением переменной литерного типа является один символ из набора символов,
определяемого конкретной реализацией. При этом некоторые из символов могут не
иметь графического представления - это управляющие символы (например,
переключение с одного регистра на другой, переход к следующей строке на бумаге
печатающего устройства и т. д.)
Хотя на Паскале не фиксируется конкретное множество символов, но каждой
отдельной версии языка Паскаль это множество должно отвечать следующим
требованиям:
-
для любого набора символов (литер)все символы фиксированы и упорядочены;
-
включены
все прописные буквы латинского алфавита от A до
Z; это множество упорядочено по алфавиту;
-
включены десятичные цифры от 0 до 9; это множество по возрастанию цифр и
связано;
-
если в
реализации допускаются строчные латинские буквы от a
от z, то они должны быть упорядочены по алфавиту;
-
включены такие символы, как пробел, запятая, точка и др.;
-
отношение
порядка между двумя символами множества значений типа
char должно быть таким же, как и между их порядковыми номерами.
Элементы множества типа
char считаются пронумерованными начиная с нуля.
Переменные этого типа занимают 1 байт памяти.
Константой литерного (символьного) типа является одна из допустимых литер,
взятая в апострофы.
ПРИМЕР: '5' 'j' '?' '+'.
Если апостроф сам принадлежит множеству значений типа
char, то апостроф, являющийся значением константы, записывается
дважды ("").
Предшествующее или следующее значение по отношению к данному зависит от
реализации множества
char и способа его упорядочения.
В Турбо Паскале в качестве значения типа char
используется один символ кода
ASCII. Для большинства символов существует
соответствующая клавиша. Для управляющих символов ASCII
используется два способа записи:
-
с использованием знака
#, предшествующего некоторому целому числу, лежащему в диапазоне от 0 до
255, которое задает номер управляющего символа ASCII,
-
с использованием знака
^, предшествующего символу.
ПРИМЕР:
#27
или #$1B или ^[
для Escape,
#7 или #$7 или
^G
для звукового сигнала.
Значение кода требуемого символа можно определить с помощью функции
ord, а обратные действия определения символа по заданному коду
выполняются функцией
chr.
Литерные данные можно вводить и выводить, присваивать и сравнивать друг с
другом. При сравнении символов фактически сравниваются не они, а их
ASCII-коды, при этом один символ считается больше другого только в том
случае, если он имеет больший ASCII-код.
НАПРИМЕР,
'A'<'B', так как ASCII-код символа
'A' равен 65, а ASCII-код символа
'B' равен 66.
Замечание. Существует функция
sizeof(x), которая позволяет определить число байтов, занимаемое
определенной переменой типа; x
- наименование типа или имя переменной. Используя эту функцию, можно
определить объем памяти, занимаемой данными стандартного типа или требуемой для
структурированных типов данных.
Перечисляемый тип
Перечисление позволяет программисту описывать новые типы данных, значение
которых определяет программист.
Описание перечисляемого типа состоит из списка его элементов, разделяемого
запятыми, заключенного в круглые скобки. Каждый из элементов представляет собой
уникальный идентификатор.
ПРИМЕР.
Type Season=(Spring, Summer, Autumn, Winter);
WeekDay=(Mon, Tue, Wed, Thu, Fri, Sat, Sun);
var Yesterday, Today, Tomorrow: WeekDay;
Описание типа и переменных можно объединить.
В рамках блока, где объявлен перечисляемый тип идентификаторы всех элементов
перечисляемого типа интерпретируются как константы.
Следует обратить внимание на то, что эти идентификаторы не являются строковыми
константами и в кавычки не заключаются. Поскольку идентификаторы перечисляемого
типа являются константами всего блока, где они объявлены, то описание одного и
того же идентификатора в разных типах считается ошибкой.
Константы предопределенных типов не могут быть значениями перечисляемого типа.
Объединение констант по какому-нибудь признаку назначаемого программистом.
Переменные описанного типа могут принимать значение любой из этих констант.
ПРИМЕР.
Today:=Mon
Так как перечисляемые типы являются порядковыми, то перечислением своих
элементов он определяют упорядоченные наборы констант. Упорядочение констант в
типе выполняется в соответствии с последовательностью, в которой перечисляются
идентификаторы. Порядковый номер константы перечисляемого типа определяется ее
позицией в списке идентификаторов при объявлении. Первая константа в списке
имеет порядковый номер 0, вторая - номер 1 и т. д.
Интервальный тип
Интервальный тип данных
–это подмножество уже определенного или стандартного
скалярного типа (кроме real). Поэтому в литературе
можно встретить другие название этого типа, например, ограниченный тип,
отрезочный тип, тип - диапазон.
Интервальный тип представляет собой диапазон (интервал) значений какого-либо
порядкового типа, называемого базовым. При описании интервального типа
указывается наименьшее и наибольшее значение диапазона значений,
допустимых для этого типа. Минимальное и максимальное значение интервала
разделяется знаком ".." (две точки).
ПРИМЕР. 0..500; -128..127; 'A'..'Z'; Mon..Fri
Переменная интервального типа имеет все свойства переменной базового типа.
Поэтому все стандартные функции и операции определенные для базового типа могут
применяться и к его отрезку, но нужно следить за тем, чтобы не выйти за
пределы введенных границ.
Если на данном базовом типе выделено несколько отрезков, что допустимо, то
переменные этих типов могут взаимодействовать в одном выражении, их можно
использовать слева и справа в операторе присваивания, но это не всегда
выполнимо.
ПРИМЕР. Пусть дано описание
var Year: 1980..1985;
Month: 1..12;
Day: 1..31;
Тогда допустимыми являются присваивания:
Day:=Month; (и выполнимым)
Day:=Year; (и невыполнимом)
Этот тип применяется в тех случаях, когда имеется информация относительно
диапазона значений переменной (это позволяет экономить память машины и
контролировать программу на этапе трансляции выполнения).
Вещественный тип (real)
Областью значений типа
real является определяемое реализацией языка
подмножество всех действительных чисел. Это множество не является упорядоченным
и потому к значениям этого типа не применимы функции
succ
и pred. Вещественные числа нельзя
использовать в качестве индексов, счетчиков в for,
селектора в
case.
Особенность типа
real связана со следующими обстоятельствами.
Действительные числа в в ЭВМ обычно представляются в форме с
плавающей точкой, т.е. внутреннее представление вещественного числа состоит
из двух частей - мантиссы и порядка, и каждая часть имеет знак.
НАПРИМЕР, число 0,087 представляется в виде 0,87x10-1
Количество разрядов, отводимых на изображение порядка, определяет диапазон
допустимых чисел, так что этот диапазон определяется конкретной ЭВМ. В отличие
от целого типа этот диапазон содержит бесконечное подмножество действительных
чисел. Так как для изображения мантиссы отводится тоже фиксированное количество
разрядов, то в машине точно может быть представлено лишь ограниченное множество
действительных чисел. Таким образом, каждое машинное
число представляет с той или иной точностью некоторый диапазон
вещественных чисел. Так что вещественные числа, вообще говоря, представляются
неточно и арифметические операции над ними выполняются не точно, а по правилам
действий над приближенными числами. Поэтому
множество значений типа
real и не является упорядоченным.
Для хранения переменных типа
Real компилятор Турбо Паскаля выделяет 6 байтов
в ОЗУ (1 бит для знака, 39 бит для мантиссы и 8 бит для порядка). Это позволяет
задавать вещественные числа (по абсолютной величине) в пределах от 2.9*10-39
до 1.7*1038.
Существует несколько вещественных типов, различающихся точностью и диапазоном
представления данных. Точность числа определяется длиной мантиссы, а диапазон -
длиной порядка.
ТИП |
НАЗВАНИЕ |
РАЗМЕР, байт |
ЗНАЧАЩИХ ЦИФР |
ДИАПАЗОН ЗНАЧЕНИЙ |
Real |
Вещественный |
6 |
11-12 |
2.9e-39
.. 1.7e+38 |
Single |
Одинарной точности |
4 |
7-8 |
1.5e-45
.. 3.4е+38 |
Double |
Двойной точности |
8 |
15-16 |
5.0е-324 .. 1.7е+308 |
Extended |
Расширенный |
10 |
19-20 |
3.4е-4932 .. 1.1е+4932 |
Comp |
Большое целое |
8 |
19-20 |
-9.22е18 .. 9.22е18 (-263 .. 263-1) |
Операции с числами, имеющими типы
comp, double, extended, single, реально
выполняются только сопроцессором. Если сопроцессор не включен, все они
выполняются процессором как операции с типом real.
В сопроцессоре операций со всеми числами выполняются
как с наиболее мощным типом данных extended.
Поэтому отказ от типа extended в пользу типов
с меньшим размером данных не дает экономии пот быстродействию, но позволяет
существенно сэкономить память.
Включение опции компиляции входа с
применением сопроцессора можно провести с помощью директивы
{$N+}.
Замечание. Как для данных целого типа, так и для данных вещественного
типа возможна ситуация, когда результат выходит за пределы допустимого диапазона
представимых в данной ЭВМ чисел.
С вещественными величинами можно выполнять арифметические операции: сложение
(+), вычитание (-), умножение (*), деление (/).
В общем случае при выполнении любой операции операнды должны быть одного и того
же типа, но целые вещественные величины смешивать разрешается, т.е. один из
операндов может быть целого типа.
ЗНАК |
НАЗВАНИЕ |
+ |
сложение |
- |
вычитание |
* |
умножение |
/ |
деление вещественное |
Примечание.
Обратите внимание на то, что целочисленное и вещественное деление записывается с
помощью разных операций. Если требуется получить вещественный результат
деления двух целых величин, нужно использовать операцию /,
если целый - операцию div.
К вещественным величинам можно также применять операции отношения. Результат
этих операций имеет логический тип.
|