
- •6.2. Структура программной единицы
- •6.3. Стиль записи программ на языке Паскаль
- •7. Типы данных в Паскале
- •7.1. Классификация типов данных в Турбо Паскале
- •7.2. Порядковые типы
- •7.2.1. Логический (булевский) тип
- •7.2.2. Целые типы
- •7.2.3. Перечисляемый тип
- •7.2.4. Тип – диапазон
- •7.2.5. Символьный тип
- •7.3. Вещественные типы
7.2.2. Целые типы
Внутреннее представление
Целые числа представляются в компьютере в двоичной системе счисления (отрицательные числа — в дополнительном коде). В Паскале определены несколько целых типов данных, отличающиеся длиной и наличием знака: старший двоичный разряд либо воспринимается как знаковый, либо является обычным разрядом числа. Внутреннее представление определяет диапазоны допустимых значений величин (от нулей во всех двоичных разрядах до единиц).
Целые типы данных:
Тип |
Название |
Размер |
Знак |
Диапазон значений |
integer |
Целое |
2 байта |
Есть |
-32 768 .. 32 767 (-215 .. 215-1) |
shortint |
Короткое целое |
1 байт |
Есть |
-128 .. 127 (-27 .. 27-1) |
byte |
Байт |
1 байт |
Нет |
0 .. 255 (0 .. 28-1) |
word |
Слово |
2 байта |
Нет |
0 .. 65 535 (0 .. 216-1) |
longint |
Длинное целое |
4 байта |
Есть |
-2 147 483 648 .. 2 147 483647(-231 231-1) |
Первоначально в Паскале был всего один целый тип — integer, остальные добавлены впоследствии для представления больших величин или для экономии памяти. Например, нет смысла отводить 4 байта под величину, про которую известно, что все ее значения находятся в диапазоне от 0 до 100.
Операции
С целыми величинами можно выполнять арифметические операции. Результат их выполнения всегда целый (при делении дробная часть отбрасывается).
Арифметические операции для целых величин
Операция |
Знак операции |
Сложение |
+ |
Вычитание |
- |
Умножение |
* |
Деление |
div |
Остаток от деления |
mod |
К целым величинам можно также применять операции отношения, которые рассматривались выше. Результат этих операций имеет логический тип, например результатом сравнения 3 < 8 будет значение true.
К данным целого типа применимы также поразрядные операции. Они выполняются над каждой парой одноименных разрядов операндов. Правила выполнения операций отрицания над одним из разрядов (например, с номером i):
Var
x = 2
x:byte; begin
00000010
x:=2;
not x = 253
11111101
not x = 253
Xi |
not Xi |
0 |
|
1 |
0 |
Поразрядное “И” или поразрядное умножение (двухместная операция)
Xi |
Yi |
Xi and Yi |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
Поразрядное “ИЛИ” или поразрядное сложение (двухместная операция)
Xi |
Yi |
Xi or Yi |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
Поразрядное “ИСКЛЮЧАЮЩЕЕ ИЛИ”. Эта операция устанавливает результат, равным единице, при несовпадении соответствующих разрядов.
Xi |
Yi |
Xi xor Yi |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
Поразрядный сдвиг вправо и влево достигается применением функций:
X Shl Y - значение X сдвигается влево на Y разрядов
X shr Y - значение X сдвигается вправо на Y разрядов.
При выполнении сдвигов мысленная граница разрядной сетки для типа числа (правая или левая) сдвигается на соответствующее число разрядов (вправо или влево):
При сдвиге вправо мысленная правая граница перемещается влево;
При сдвиге влево мысленная левая граница перемещается вправо.
Выдвигаемые в направлении сдвига разряды числа, которые пересекают мысленную границу числа, отбрасываются. С противоположной стороны при сдвигах нужное количество разрядов добавляется (оно обычно заполняется нулями).
Нулями всегда заполняются разряды, добавляемые при сдвиге влево или вправо целых положительных чисел. При этом сдвиг влево на Nразрядовэквивалентен умножениюна 2N, а сдвиг вправо наNразрядовравносилен целочисленному делению(без остатка) на 2N.
При сдвиге вправо отрицательных чисел типов shortint,integerиlongint(они могут иметь отрицательные значения) в освободившиеся слева разряды записываются копии знакового разряда. При этом сам знаковый разряд циклически восстанавливается на своем старом месте. По сути дела SHR есть арифметический сдвиг.
При сдвиге этих же чисел влево знаковый разряд замещается тем значением, которое придет справа. Но так происходит лишь если выключена опция компилятора Range Checking. Если же она включена, то при попытке изменить знаковый разряд получим сообщение о выходе за границы диапазона.
Например, результатом операции 12 shr2 будет значение 3, поскольку двоичное представление числа 12 — 1100. Выполнив операцию 12shl1, то есть сдвинув это число влево на 1 разряд, получим 24.
Эти поразрядные логические операции используются для выполнения следующих действий:
выделение нужного фрагмента двоичного кода;
очистка (установка в ноль) нужного фрагмента двоичного кода;
проверка (равен 0 или 1) разрядов нужного фрагмента двоичного кода;
инвертирование нужного фрагмента двоичного кода (весь код можно проинвертировать с помощью операции not);
занесение единицы в нужные разряды двоичного кода.
Во всех далее рассматриваемых случаях все действия выполняются с использованием поразрядных операций и так называемой маски (вспомогательный двоичный код – константа, который для каждого конкретного случая устанавливается по своему).
Стандартные функции и процедуры
К целым величинам можно применять стандартные функции и процедуры
Имя |
Описание |
Результат |
Пояснения |
Функции | |||
abs |
Модуль |
Целый |
|х| записывается abs(x) |
arctan |
Арктангенс угла* |
Вещественный |
arctg x записывается arctan(x) |
cos |
Косинус угла |
Вещественный |
cos x записывается cos(x) |
ехр |
Экспонента |
Вещественный |
ех записывается ехр(х) |
ln |
Натуральный логарифм |
Вещественный |
logex записывается ln(х) |
odd |
Проверка на четность |
Логический |
odd(3) даст в результате true |
pred |
Предыдущее значение |
Целый |
pred(3) даст в результате 2 |
sin |
Синус угла |
Вещественный |
sin x записывается sin(x) |
sqr |
Квадрат |
Целый |
х2 записывается sqr(x) |
sqrt |
Квадратный корень |
Вещественный |
x записывается sqrt(x) |
succ |
Следующее значение |
Целый |
succ(3) даст в результате 4 |
Процедуры | |||
inc |
Инкремент |
|
inc(x) — увеличить х на 1 inc(x, 3) — увеличить х на 3 |
dec |
Декремент |
|
dec(x) — уменьшить х на 1 dec(x, 3) — уменьшить х на 3 |
* – Угол задается в радианах.
Замечание: по поводу функций и процедур: процедура и функция отличаются формой вызова.
Пример:
Var
x,
y: integer;
begin
x := 10;
c := -10;
Dec(x); { Вызов процедуры Dec}
y := abs(c); { Вызов функции abs}
…
end.