[Оглавление] | [<< страница] | [>>страница] |
Любой новый простейший тип определяется простым перечислением входящих в него различных значений. Такой тип называется перечисляемым.
Определение таких типов вводит не только идентификатор нового типа, но и одновременно множество идентификаторов, обозначающих значения этого нового типа. Затем везде в программе и| можно уже использовать как константы, что в значительной степени способствует наглядности.
Если предполагается, что переменные s, d, г и b определяются как целые числа константы в порядке их перечисления отображаются в натуральные числа. Кроме этого транслятор может проверить состоятельность использования той или иной операции.
Поскольку перечисления задают упорядоченность, то перечисляемые типы будут весьма чувствительными к введению операций, порождающих для заданного аргумента предыдущие или последующие значения.
К стандартным простейшим типам мы относим типы, имеющиеся (встроенные) на большинстве вычислительных машин. Сюда входят целые числа, логические истинностные значения и множество печатаемых символов. На многих машинах есть и дробные числа вместе с соответствующими стандартными арифметическими операциями. В Си обозначают эти типы следующими идентификатора- ми:
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) и не зависящие от системы, следует все же выделить некоторые из свойств, присущих множеству символов, а именно:
[Оглавление] | [<<страница] | [>>страница] | [В начало ] |