Десятичный тип с фиксированной точкой
Используется в коммерческих приложениях, чтобы избежать ошибок округления.
Спецификация. Десятичное число с фиксированной точкой представляется как последовательность десятичных цифр фиксированной длины с десятичной точкой, разделяющей целую и дробную часть числа. Местоположение десятичной точки задается явно.
Пример: Язык PL/1 – объявление переменной x
DECLARE X FIXED DECIMAL (10.2);
Реализация. Число хранится как целое, причем каждая десятичная цифра представляется двоичным четырехразрядным числом. Положение десятичной точки задается атрибутом, называемым масштабным коэффициентом.
Арифметические операции и операции сравнения моделируются программно.
Комплексный тип
Обычно включен в ЯП, ориентированные на решение научно-технических задач, в которых используются комплексные числа. (FORTRAN)
Спецификация. Комплексное число записывается в виде упорядоченной пары вещественных чисел, представляющих его вещественную и мнимую части.
Реализация. Хранится как пара вещественных чисел, расположенных в смежных областях памяти.
Операции над комплексными числами моделируются программно.
Рациональный тип
Рациональный тип включается в ЯП для того, чтобы избежать проблем с округлением и усечением, имеющих место при использовании вещественных чисел с плавающей и фиксированной точкой.
Спецификация. Рациональное число имеет вид упорядоченной пары целых чисел неограниченной длины, представляющих его числитель и знаменатель.
Реализация. Хранится в виде двух связанных списков, представляющих его числитель и знаменатель.
Рис.1.5. Рациональное число 3/2
Операции над рациональными числами моделируются программно.
Логический тип
Логический (булевский) тип данных присутствует в большинстве ЯП.
Спецификация. Состоит из объектов, которые могут принимать два значения: истина (true) и ложь (false), причем false<true.
Операции:
ПрисвОп: Boolean1´Boolean2®void
или
Boolean1´Boolean2®Boolean3
и логические операции (умножение, сложение и отрицание):
ЛогУмн (and): Boolean1´Boolean2®Boolean3
ЛогСлож (or): Boolean1´Boolean2®Boolean3
ЛогОтр (not): Boolean1 ®Boolean2.
Менее распространены такие логические операции, как эквивалентность, исключающее ИЛИ, импликация, И-НЕ,
ИЛИ-НЕ.
Реализация. Объекты логического типа представляются минимальной адресуемой областью памяти (байтом или словом).
Значения истина или ложь могут быть реализованы одним из двух способов:
§ Какой-то определенный бит внутри области памяти (например, знаковый бит) используется для представления логического значения (ложь=0, истина=1), а остальные биты игнорируются;
§ Значению ложь соответствуют нули во всех битах отводимой области памяти, а любые другие комбинации единиц и нулей в этой области памяти интерпретируются как значение истина.
В некоторых ЯП, например, в С, для представления логического типа используются целые числа (истина – любое ненулевое значение, а ложь – нулевое значение).
Простейшие логические операции (умножение, сложение, отрицание) реализуются аппаратно, а остальные операции моделируются программно.
Символьный тип
Значением объекта данных символьного типа является одиночный символ.
Спецификация. Множество значений задается перечислением символов, соответствующим стандартному набору (например, ASCII или Unicode).
Операции:
ПрисвОп: char1´char2®void
или
char1´char2®char3
и сравнения:
СравнОп: char1´char2®Boolean.
Для прямого и обратного отображений множества символьных значений на подмножество натуральных чисел, являющихся порядковыми номерами этих значений, в некоторые ЯП (например, в Паскаль) встроены функции преобразования, являющиеся обратными по отношению друг к другу:
Ord: char®integer,
Chr: integer®char,
А также функции определения предыдущего (successor) и следующего (predecessor) символов:
Pred: char®char,
Succ: char®char.
Реализация. Символьный тип данных обычно поддерживается аппаратно, т. к. объекты этого типа используются для ввода-вывода.
Указатели
Указатели обеспечивают возможность конструирования произвольных структур данных из объектов разного типа.
Спецификация. Тип данных указатель определяет класс объектов данных, значением которого является ссылка на местоположение (адрес) другого объекта данных или пустой указатель (null).
Два способа определения указателей:
1. Указатели могут ссылаться только на объекты данных одного типа. Такой подход используется в ЯП, в которых применяется статических контроль и объявления типов (С, Pascal, Ada).
2. Указатели могут ссылаться на объекты данных любого типа в различные моменты выполнения программы. Такой способ используется в ЯП с динамическим контролем типов (Smalltalk). Значение типа объекта, на который производится ссылка в текущий момент времени, хранится в дескрипторе.
В C, C++, Pascal указатели являются объектами данных, которые можно явно использовать в программе. При этом указатели могут быть как простыми переменными, так и компонентами сложных структур данных. В языке Java указатели являются частью скрытых структур данных, управляемых реализацией языка.
Операции:
§ Операция создания объекта данных фиксированного размера. В результате выполнения этой операции в памяти отводится место для нового объекта, создается указатель на этот объект данных, которому присваивается значение ссылки (адреса) на этот объект;
§ Операция разыменования использует значение указателя для доступа к объекту данных, на который он ссылается.
Для указателей-переменных, явно употребляемых в программе, используются операции:
§ Операция присваивания. Значение одного указателя присваивается другому указателю.
Спецификация имеет вид:
ПрисвОп: ptr1´ptr2®void
или
ptr1´ptr2®ptr3;
§ Операции сравнения равно и не равно для указателей, ссылающихся на объекты одного типа.
Спецификация:
СравнОп: ptr1´ptr2®Boolean;
§ Бинарные арифметические операции (сложение, вычитание):
БинОп: ptr1´ptr2®ptr3;
§ Унарные арифметические операции (инкремент и декремент):
УнарОп: ptr1®ptr2.
Реализация. Два основных представления значений указателей в памяти компьютера:
§ Абсолютный адрес. Значение указателя представляет собой адрес области памяти, отведенной для объекта данных;
§ Относительный адрес. Значение указателя представляет собой смещение относительно базового адреса области памяти, отводимой для размещения объектов.
Недостатком абсолютной адресации является то, что управление памятью становится более сложным, так как ни один объект данных не может быть перемещен в памяти, пока существует указатель, ссылающийся на этот объект.
Арифметические операции над указателями выполняются как над обычными целыми числами, но значения, участвующие в операции, являются адресами оперативной памяти компьютера.
Символьные строки
Символьная строка – это объект данных, образованный последовательностью символов.
Спецификация. Различают символьные строки следующих видов:
· Символьные строки фиксированной длины. Значениями могут быть строки символов только этой длины. Более длинная строка обрезается до заданной длины, более короткая – добавляется пробелами до заданной длины.
· Символьные строки переменной длины, ограниченной максимальным значением. Строки могут содержать меньшее количество символов или быть пустыми.
· Символьные строки неограниченной длины. Строка имеет любую длину, которая может изменяться в процессе выполнения программы.
Операции над строками:
v Операция присваивания:
ПрисвОп: str1´str2®void
или
ПрисвОп: str1´str2®str3;
v Конкатенация (объединение) строк:
КонкСтр: str1´str2®str3;
v Операции сравнения: равно, не равно, больше, меньше, больше или равно, меньше или равно.
Спецификация:
СравнОп: str1´str2®Boolean.
Строки сравниваются в лексикографическом порядке. Более короткая строка дополняется пробелами.
v Выбор подстроки по указанной позиции первого символа и длине или по указанным позициям ее первого и последнего символов:
Выбор: str1´integer1´integer2®str2;
v Выбор подстроки на основе сопоставления с образцом:
ВыборОбр: str1´str2®integer1,integer2.
Результатом выполнения операции является пара целых чисел, определяющих позиции первого и последнего символов подстроки.
Реализация. Каждый из трех способов задания строк по-разному представляется в памяти компьютера. Обычно аппаратно поддерживаются только строки фиксированной длины, а для реализации остальных требуется программное моделирование.
Операции также реализуются путем программного моделирования.
Рис.1.6. Три способа представления символьных строк в памяти
Перечислимые типы
Тип данных перечисление позволяет программисту определять переменные, которые могут принимать значения из ограниченного множества допустимых значений.
Спецификация. Перечисление определяется как отдельный тип, которому присваивается имя.
Паскаль:
Type color=(white, red, green, blue, black);
Var circle, square: color;
Операции:
· Операции сравнения: равно, не равно, больше, меньше, больше или равно, меньше или равно;
· Операция присваивания;
· Операции succиpred, которые определяют соответственно последующий и предыдущий элементы.
Реализация. Перечислимый тип представляется в памяти компьютера последовательностью неотрицательных целых чисел, каждое из которых является порядковым номером элемента перечислимого типа в последовательности. Используются короткие целые числа.
Реализация операций выполняется с использованием встроенных операций над целыми числами.
Ограниченные типы
Ограниченным типом называется непрерывная последовательность (перечислимого, целого, логического) типа.
Паскаль:
Type size=1..100;
Var index: size;
Определены все операции, допустимые для базового типа.
Реализация ограниченных типов не имеет особенностей по отношению к реализации соответствующих базовых типов.