Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
теория.pdf
Скачиваний:
489
Добавлен:
11.05.2015
Размер:
1.15 Mб
Скачать

Основные типы – это типы, состоящие из единственного элемента данных (так называемые тривиальные структуры данных).

Основные типы делятся на:

ссылочный тип;

скалярные типы.

Скалярные типы в свою очередь делятся на:

стандартные типы – это типы, зафиксированные в языке (предопределенные типы); например, типы Integer, Real, Char;

описанные типы – это типы, определенные программистом; например, перечислимый тип.

В языке Паскаль большинство скалярных типов обладает свойством перенумерованности (упорядоченности). Оно обозначает, что среди элементов соответствующего типа данных установлен линейный порядок. Таким образом, относительно любых двух элементов данного типа определено, какой из них предшествует другому.

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

В Паскале производные типы данных делятся на:

стандартные (предопределенные) – например, типы String, Text и др.

описанные – например, массивы, записи и др.

Классификацию типов языка Паскаль иллюстрирует рисунок 5.1.

5.2.Стандартные скалярные типы данных

5.2.1. Целочисленные типы

В языке Паскаль существует пять целочисленных типов:

shortint (короткое целое);

integer (целое);

longint (длинное целое);

byte (байт);

word (слово).

Их характеристики иллюстрирует таблица 5.1.

98

 

 

 

Типы

 

 

 

 

значений

 

Основные

 

Производные

Ссылочный

Скалярные

Стандартные

Описанные

Стандартные

Описанные

 

Рисунок 5.1 – Классификация типов языка Паскаль

Таблица 5.1 – Характеристики целочисленных типов

 

Тип

Диапазон

Формат

 

 

 

shortint

-27 ÷ 27 – 1

1 байт

(-128 ÷ 127)

(8 битов со знаком)

 

 

 

 

integer

-215 ÷ 215 – 1

2 байта

(-32768 ÷ 32767)

(16 битов со знаком)

 

 

 

 

longint

-231 ÷ 231 – 1

4 байта

(-2147483648 ÷ 2147483647)

(32 бита со знаком)

 

 

 

 

byte

0 ÷ 28 - 1

1 байт

(0 ÷ 255)

(8 битов без знака)

 

 

 

 

word

0 ÷ 216 – 1

2 байта

(0 ÷ 65535)

(16 битов без знака)

 

 

 

 

99

В памяти машины целые числа хранятся в виде двоичного числа с фиксированной точкой (ФТ) и занимают (как видно из таблицы) 1 байт, 2 байта или 4 байта.

Внутреннее представление целых чисел.

Рассмотрим внутреннее представление целых чисел в персональных компьютерах на базе, например, 16-разрядных микропроцессоров Intel. Разрядная сетка таких компьютеров может быть представлена так, как показывает рисунок 5.2.

На данном рисунке под каждым разрядом указан его номер (принято нумеровать разряды со стороны младших разрядов, начиная с нуля), а над каждым разрядом – его вес.

215 214

22

21

20

 

 

 

 

 

 

15 14

2

1

0

Рисунок 5.2 – Разрядная сетка 16-разрядного микропроцессора

Минимальное двоичное число, которое может быть записано в данной разрядной сетке –

000...0002 = 010

(в качестве нижнего индекса указано основание системы счисления). Максимальное число, которое может быть записано в шестнадцати

разрядах –

11...112 = 215 + 214 + 213 + ... + 21 + 20 = 216 1 = 6553510

Этот диапазон (0 ÷ 65535) соответствует формату Word Паскаля.

Для типа Byte используется один байт без знака (рисунок 5.3). В данном случае диапазон представления чисел –

00...002 ÷ 11..112 = 0 ÷ 28 1 = 25510

100

27

22

21

20

 

 

 

 

 

7

2

1

0

Рисунок 5.3 – Представление типа Byte

Для чисел со знаком старший бит соответствующего поля памяти, отведенного для хранения числа, считается знаковым (рисунок 5.4). Если в нем 0 – число положительное (знак +), 1 – отрицательное (знак –).

Знак 214 213

22

21

20

 

 

 

 

 

 

 

 

 

 

 

 

15 14 13

2

1

0

 

 

 

 

 

 

 

 

 

 

 

Рисунок 5.4 – Представление шестнадцатеричных чисел со знаком

Максимальное число (положительное), которое может быть записано в данной разрядной сетке:

11...112 = 215 1 = 3276710 .

Минимальное положительное число:

00...002 = 010 .

Отрицательные числа в памяти машины хранятся в дополнительном коде. Дополнительный код (ДК) числа i образуется путем инвертирования (замены значения на противоположное) всех значащих разрядов прямого кода числа и прибавления 1 к самому младшему разряду. Аналогично производится

преобразование из дополнительного кода в прямой код. Например, пусть i = 1.

101

000...01

прямой код числа 1

111...10

обратный код числа 1

+1

 

----------

дополнительный код числа 1.

111...11

Дополнительный код числа i может также быть определен по формуле iдоп = 2n i ,

где n – разрядность представления операндов (включая знак), i модуль i.

Пример 5.1.

Представление чисел для n = 3 (рисунок 5.5).

Знак

2значащих

разряда

Рисунок 5.5 – Представление чисел для n = 3

Таблица 5.2 поясняет правила получения дополнительного кода числа из его прямого кода в полученном диапазоне. Здесь: 10СС – десятичная система счисления, 2СС – двоичная система счисления.

Диапазон представления при n = 3:

2n1 ÷ 2n1 1 = −22 ÷ 22 1 = −4 ÷ +3 .

102

Таблица 5.2 – Правила получения дополнительного кода из прямого кода числа при n = 3

 

Исходное

Представ-

Правило

 

 

 

число i

ление чис-

получения ДК

Примечания

 

 

в 10СС

ла i в 2СС

2n – |i| = 8 |i|

 

 

 

–4

100

8 – 4 = 4

Формирование

 

 

–3

101

8 – 3 = 5

дополнительного кода для

 

 

–2

110

8 – 2 = 6

отрицательных чисел. В

 

 

–1

111

8 – 1 = 7

знаковом разряде получена

 

 

 

 

 

единица.

 

 

0

000

Сохранение прямого кода для

 

 

1

001

положительных чисел. В

 

 

2

010

знаковом разряде – ноль.

 

 

3

011

 

 

 

 

 

 

 

 

Пример 5.2.

Представление целых чисел для n = 16.

Формула для определения дополнительного кода числа в этом случае имеет вид:

iдоп = 216 i

Представление целых чисел в формате два байта со знаком иллюстрирует таблица 5.3. Здесь 16СС – шестнадцатеричная система счисления.

Таблица 5.3 – Представление целых чисел в формате два байта со знаком

 

Исходное

Представление

Представле-

Примечание

 

 

число i

числа i в 2СС

ние числа i

 

 

в 10СС

в 16СС

 

 

 

 

 

 

 

 

–2

15

1000 0000 0000 0000

8000

Формирование

 

 

 

 

дополнительного кода для

 

 

–2

15

+1

1000 0000 0000 0001

8001

 

 

15

отрицательных чисел. В

 

 

–2

+2

1000 0000 0000 0010

8002

 

 

 

знаковом разряде получена

 

 

--------

--------------------------

-----

 

 

единица.

 

 

 

 

1

1111 1111 1111 1111

FFFF

 

 

 

 

 

 

 

 

 

 

0

0000 0000 0000 0000

0000

Сохранение прямого кода

 

 

 

 

+1

0000 0000 0000 0001

0001

для положительных чисел. В

 

 

 

 

+2

0000 0000 0000 0010

0002

знаковом разряде – ноль.

 

 

--------

--------------------------

-----

 

 

 

+215 –1

0111 1111 1111 1111

7FFF

 

 

 

 

 

 

 

 

 

 

 

103

Итак, диапазон представления чисел со знаком в шестнадцати разрядах

равен

215 ÷ 215 1 ,

что соответствует типу Integer в Паскале.

Аналогично представление информации для типа Shortint (рисунок 5.6).

Знак 26

21

20

 

 

 

 

 

 

7

6

1

0

Рисунок 5.6 – Представление восьмиразрядных чисел со знаком Диапазон представления чисел со знаком в восьми разрядах равен:

27 ÷ 27 1 .

Для типа Longint представление информации иллюстрирует рисунок 5.7.

Знак 230

22

21

20

 

 

 

 

 

 

 

 

31

30

 

2

1

0

Рисунок 5.7 – Представление тридцатидвухразрядных чисел со знаком

Из данного рисунка следует, что диапазон представления чисел со знаком в тридцати двух разрядах равен:

231 ÷ 231 1.

104

Целочисленные константы и переменные.

В программах целые числа обычно используются в качестве счетчиков (для управления количеством повторений цикла) и в качестве индексов. При обработке целых чисел используется арифметика с ФТ, округления не производятся, вычисления выполняются точно.

Множество целочисленных значений является перенумерованным, порядковым номером каждого значения целочисленного типа является само это значение.

Например, порядковый номер числа 5 равен 5, числа (-5) – (-5), порядковый номер нуля равен нулю.

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

Var

a, b: integer;

c:shortint;

d:word;

Целые константы делятся на два типа – десятичные и шестнадцатеричные:

Признак шестнадцатеричной константы – знак $ перед числом. Примеры записи десятичных констант:

+16 25 –48

Примеры записи шестнадцатеричных констант:

$F $9A0

Целой константе присваивается целочисленный тип с наименьшим диапазоном, включающим значение этой константы.

Операции над целочисленными данными.

Над целочисленными данными в Паскале определены операции, которые представляет таблица 5.4.

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

Например, общим типом для целого (Integer) и длинного целого (Longint) является Longint. Общим типом для типов Integer и Word является Longint.

105

Действие выполняется в соответствии с точностью общего типа.

Для всех целочисленных типов переполнение при выполнении арифметических операций не обнаруживается.

Таблица 5.4 – Операции над целочисленными данными

Группа

Опера-

 

 

Тип резуль-

опера-

Вид

Описание

ций

ция

 

 

тата

 

 

 

 

Арифметические операции

+

Одноместная

Сохранение знака

Целый

Одноместная

Отрицание знака

Целый

+

Двухместная

Сложение

Целый

 

 

Двухместная

Вычитание

Целый

 

*

Двухместная

Умножение

Целый

 

/

Двухместная

Деление

Вещественный

 

div

Двухместная

Целочисленное деление

Целый

 

mod

Двухместная

Остаток целочисленного

Целый

 

 

 

деления

 

 

not

Одноместная

Поразрядное дополнение

 

Логические операции

and

Двухместная

целого

Целый

сложение (ИЛИ)

 

Поразрядное логическое

 

 

or

 

умножение (И)

 

 

Двухместная

Поразрядное логическое

 

 

xor

Двухместная

Поразрядное логическое

 

 

 

 

исключающее ИЛИ

 

Операции сдвига

shl

Двухместная

i shl j – сдвиг влево значения

Тип i

 

 

значения i на j битов

 

 

 

 

i на j битов

 

 

shr

Двухместная

i shr j – сдвиг вправо

Тип i

 

 

 

 

 

Операции сравнения

=

Двухместная

Равно

Логический

<=

Двухместная

Меньше или равно

 

<>

Двухместная

Не равно

 

 

<

Двухместная

Меньше

 

 

>

Двухместная

Больше

 

 

>=

Двухместная

Больше или равно

 

106

Примеры и пояснения к выполнению операций над целочисленными данными.

Пример 5.3.

Выполнение операций div, mod.

Результат операции А div В равен целой части результата деления А на В. Знак результата определяется по общим правилам деления.

Результат операции А mod В определяется в соответствии с выражением:

Amod B = A ( Adiv B ) B .

Например,

 

10 div 3 = 3

10 div (3) = 3

10 mod 3 = 1

10 mod (3) = 1

(10) div 3 = 3

(10) div (3) = 3

(10) mod 3 = 1

(10) mod (3) = 1

Пример 5.4.

Выполнение операций сдвига shl, shr.

Логические операции и операции сдвига осуществляют поразрядную обработку внутренних представлений целочисленных значений. Для правильного использования этих операций необходимо знать внутреннее представление целых чисел в машине. Использование этих операций приводит к машинной зависимости программ.

Пусть числа имеют тип Byte.

А) 2 shl 5

Внутреннее представление числа 2:

210 = 0000 00102 .

Сдвиг двоичного представления числа 2 влево на 5 двоичных разрядов дает результат:

0100 0000 = 6410 .

Поэтому 2 shl 5 = 64.

107

Следует обратить внимание, что сдвиг двоичного представления числа влево на один двоичный разряд эквивалентен умножению данного числа на 2. Для предыдущего примера числа на сдвиг двоичного представления числа влево на 5 двоичных разрядов эквивалентен умножению данного числа на 25.

2 25 = 26 = 64 .

В) 6 shr 2

Внутреннее представление числа 6:

610 = 0000 01102 .

Сдвиг двоичного представления числа 6 вправо на 2 двоичных разряда дает результат:

0000 00012 = 110 .

Поэтому 6 shr 2 = 1.

Следует обратить внимание, что сдвиг двоичного представления числа вправо на один двоичный разряд эквивалентен делению данного числа на 2. Для предыдущего примера сдвиг двоичного представления числа вправо на 2

двоичных разряда эквивалентен целой части результата деления данного числа на 22:

6 div 22 = 1.

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

Пример 5.5.

Выполнение поразрядных логических операций and, or, xor, not. Выполнение логических операций над соответствующими двоичными

разрядами операндов поясняет таблица 5.5.

108

Таблица 5.5

– Правила выполнения логических операций

 

 

 

 

 

And (И, ·)

Or (Или, +)

Xor ( )

Not (Не)

 

 

 

 

0 · 0 = 0

0 + 0 = 0

0 0 = 0

0→1

0 · 1 = 0

0 + 1 = 1

0 1 = 1

1→0

1 · 0 = 0

1 + 0 = 1

1 0 = 1

 

1 · 1 = 1

1 + 1 = 1

1 1 = 0

 

Пусть числа имеют тип Byte.

А) 12 and 5

Внутреннее представление числа 12:

1210 = 0000 11002 .

Внутреннее представление числа 5:

510 = 0000 01012 .

and 0000 1100 0000 0101 0000 0100

Результат операции равен

0000 01002 = 410 .

Поэтому 12 and 5 = 4.

В) 12 or 5

or 0000 1100 0000 0101 0000 1101

Результат операции равен

0000 11012 = 1310 .

Поэтому 12 or 5 = 13.

С) 12 xor 5

109

xor 0000 1100 0000 0101 0000 1001

Результат операции равен

0000 10012 = 910 .

Поэтому 12 xor 5 = 9.

D) not 12

not 0000 1100 1111 0011

Результат операции равен

1111 00112 = 24310 .

Поэтому not 12 = 243.

Встроенные процедуры и функции, определенные над целочисленными данными.

Помимо операций над данными целочисленных типов определен ряд встроенных подпрограмм (функций и процедур).

Встроенные процедуры и функции – это процедуры и функции, которые определены в компиляторе языка программирования. Имена встроенных процедур и функций являются предопределенными идентификаторами.

Для получения значения встроенной процедуры или функции в программе записывается ее имя и аргументы в формате, который представляет рисунок 5.8.

<Имя> ( <Аргумент> )

,,

Рисунок 5.8 – Синтаксическая диаграмма обращения к подпрограмме

110

В компиляторе Паскаля определено около 100 встроенных процедур и функций (помимо определенных в стандартных модулях).

Над целочисленными данными определены процедуры и функции, основные из которых содержит таблица 5.6.

Таблица 5.6 – Процедуры и функции, определенные над целочисленными данными

Подпрограм-

Вид

Описание

Тип

 

ма

результата

 

 

 

 

 

 

 

 

 

Chr(x)

Функция

Возвращает символ кода ASCII с

char

 

заданным номером (x: byte)

 

 

 

 

 

 

 

 

Возвращает порядковый номер

 

 

Ord(x)

Функция

скалярного аргумента x

longint

 

 

 

(Ord(5) = 5; Ord(0) = 0; Ord(-5) = 5)

 

 

Abs(x)

Функция

Абсолютное значение х

Тип x

 

 

 

 

 

 

Sqr(x)

Функция

x2

Тип x

 

 

 

 

 

 

Dec(x, [n])*

Процедура

Уменьшает значение x на величину n

Тип x

 

(по умолчанию на единицу;

 

 

 

n:longint)

 

 

Inc(x, [n])*

 

Увеличивает значение x на величину

 

 

Процедура

n (по умолчанию на единицу;

Тип x

 

 

 

n:longint)

 

 

Odd(x)

 

Возвращает True (истину), если

 

 

Функция

аргумент нечетный, False (ложь) –

Boolean

 

 

 

если четный (x:longint)

 

 

 

 

Возвращает предшествующий

 

 

Pred(x)

Функция

элемент в типе аргумента (для

Тип x

 

целочисленных данных возвращает

 

 

 

x 1)

 

 

Succ(x)

 

Возвращает следующий элемент в

 

 

Функция

типе аргумента (для целочисленных

Тип x

 

 

 

данных возвращает x + 1)

 

 

Hi(x)

Функция

Возвращает старший байт своего

byte

 

аргумента (x: integer или x: word)

 

 

 

 

 

 

Lo(x)

Функция

Возвращает младший байт своего

byte

 

аргумента (x: integer или x: word)

 

 

 

 

 

 

 

 

 

111

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]