Простейшие типы данных
[Оглавление] [<< страница] [>>страница]


   Простейшие типы данных
 

Любой новый простейший тип определяется простым перечислением входящих в него различных значений. Такой тип называется перечисляемым.

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

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

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


   1.1 Простейшие стандартные типы

К стандартным простейшим типам мы относим типы, имеющиеся (встроенные) на большинстве вычислительных машин. Сюда входят целые числа, логические истинностные значения и множество печатаемых символов. На многих машинах есть и дробные числа вместе с соответствующими стандартными арифметическими операциями. В Си обозначают эти типы следующими идентификатора- ми:

int, float, char.

Тип int включает в себя некоторое подмножество целых чисел, размер которого варьируется от машины к машине. Если для представления целых чисел в машине используется п разрядов, причем используется дополнительный код, то допустимые числа должны удовлетворять условию –2n-1< х < 2n-1. Считается, что все операции над данными этого типа выполняются точно и соответствуют обычным правилам арифметики. Если результат выходит за пределы представимого множества, то вычисления будут прерваны. Такое событие называется переполнением. Четыре основные арифметические операции считаются стандартными: сложение (+) вычитание (-), умножение (*) и деление (/). Мы будем делать отличие между эйлеровской целой арифметикой и модульной; в первой деление обозначается косой чертой, а взятие остатка от деления — %. Пусть частное q = m/п, а остаток r = m % п. Всегда справедливо отношение q*n + r=m и 0 < |r| < | n|.

Знак остатка тот же, что и у делителя (или же остаток равен нулю). Следовательно, эйлерово целое деление несимметрично относительно нуля и для него справедливы равенства:

(-m) /п = m/ (-n) = - (m / п).

Примеры:

31/10=3 31%10=1 -31/10=-3 -31%10=-1

31/-10=-3 31%-10=1 -31/-10=3 -31%-10=-1

В модульной (конгруэнтной) арифметике значение m % n фактически есть некоторый класс конгруэнтности, т. е. множество целых, а не единственное число. В это множество входят все числа вида m - Q * п для произвольных Q. Очевидно, что такие классы можно представлять одним специфическим элементом, например самым маленьким из неотрицательных элементов. Следовательно, мы определяем R = m MOD n и в то же время Q= m / n так что удовлетворяются соотношения:

Q*n+R=m и 0≤R≤n.

Примеры:

31/10=3 31 MOD 10=1

-31/10=-4 -31 MOD 10=9

Необходимо обратить внимание, что деление на 10n можно выполнять, сдвигая десятичное число вправо на п позиций, причем "выдвигаемые" цифры просто игнорируются. Этот же прием допустим, когда число представлено не в десятичном, а в двоичном виде. Если мы имеем дело с представлением в дополнительном коде (а на большинстве современных машин именно так и обстоит дело), то сдвиг реализует деление, определенное выше как операция << (а не операция /). Умеренно сложные трансляторы поэтому представляют операции вида m / 2n с помощью быстрой oпepaции сдвига, однако это упрощение к выражениям типа m / 2n не применимо.

Если про некоторую переменную известно, что она не принимает отрицательных значений (скажем, это какой-то счетчик), то это свойство можно подчеркнуть, сославшись на дополнительный стандартный тип Unsigned. Если на машине для представления целых (без знака) используется п разрядов, то переменым такого типа можно присваивать величины, удовлетворяющие условию 0 ≤ х < 2n. Тип float обозначает подмножество вещественных чисел. Считается, что арифметика с операндами типа int дает точный результат, однако аналогичные действия со значениями типа float могут быть неточными в пределах ошибок округлений, вызванных вычислениями с конечным числом цифр. Это принципиальное различие, и оно привело в большинстве языков программирования к явно различным типам int и float.

Два значения двоичного типа BOOLEAN обозначаются идентификаторами TRUE и FALSE. Булевские операции — это логические конъюнкция, дизъюнкция и отрицание. Их значения (результаты) определены в табл. 1.1. Логическая конъюнкция обозначается через AND (или &), логическая дизъюнкция — OR, а отрицание — NOT (или -). Обращаем внимание, что операции сравнения дают результат типа BOOLEAN. Таким образом, результат некоторого сравнения можно присвоить какой-то переменной или же использовать в качестве логического операнда в булевском выражении. Например, для булевских переменных/) и q и целых переменных х = 5, г/ = 8,2=10 два присваивания:

q:=(x<y)&(y<z);

породят результаты: р = FALSE и q = TRUE.

Таблица 1.1. Логические операции

р q p AND q p OR q NOT p
TRUE TRUE TRUE TRUE FALSE
TRUE FALSE TRUE FALSE FALSE
FALSE TRUE TRUE FALSE TRUE
FALSE FALSE FALSE FALSE TRUE

Логические операции AND и OR в Си Паскале (и в некоторых других языках) обладают дополнительными свойствами, отличающими их от других бинарных операций. В то время когда, например, сумма х + у не определена, если х или у неизвестны, конъюнкция р & q определена даже при неизвестном q, если известно, что р имеет значение FALSE. Такая "условность" является важным и полезным свойством. Поэтому точное определение AND и OR дается такими двумя уравнениями:

р AND q = если р, тогда q, иначе FALSE,

р OR q = если р, тогда TRUE, иначе q.

В стандартный тип char входит множество печатаемых символов. К несчастью, не существует такого стандартного множества символов, которое было бы принято на всех вычислительных машинах. Поэтому использование определения "стандартное во многих случаях может приводить к неверному пониманию: и ситуацию errorг следует воспринимать как стандартное для той вычислительной машины, на которой следует выполнить некоторую программу.

Наиболее широко распространено множество символов, принятое в качестве стандартного Международной организацией по стандартизации (ISO), и в частно-сти его американская версия ASCII (American Standard Code for Information Inter-change). В частности, это множество состоит из 95 печатаемых (графических) символов и 33 управляющих, последние используются главным образом при передаче данных и для управления печатающими устройствами.

Чтобы иметь возможность составлять алгоритмы, манипулирующие символами (т. е. значениями типа char) и не зависящие от системы, следует все же выделить некоторые из свойств, присущих множеству символов, а именно:

[Оглавление] [<<страница] [>>страница] [В начало ]