Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Stud_1_1 / LecRus / MainPart.doc
Скачиваний:
116
Добавлен:
03.03.2016
Размер:
5.03 Mб
Скачать

2. Целые типы данных.

Значениями переменных целого типа являются элементы ограниченного подмножества целых чисел.

В Турбо Паскале имеется пять целочисленных типов данных: shortint, byte, integer, word и longint.

Тип shortint (short intеger – короткое целое) обозначает целочисленную переменную длиной один байт со знаком. Биты однобайтного поля памяти нумеруются в последовательности 0, 1, 2, 3, 4, 5, 6, 7. Нулевой бит – это знак числа: 0 – «+», 1 – «-». Следовательно, значение числа определяется семью двоичными цифрами. Число типа shortint изменяется в пределах -128 .. 127 (минимальное значение 100000002 = -12810, см. раздел «Представление информации в ПЭВМ»).

Тип byte – это короткое целое длиной один байт без знака (все восемь бит - двоичные цифры), пределы изменения 0 .. 255.

Тип integer определяет целое число длиной два байта со знаком. Пределы изменения –от –32768 до 32767. Этому типу соответствует предописанная константа MaxInt, равная максимальному значению числа: MaxInt = - 1 = 32767 .

Тип word – это целое длиной два байта без знака, пределы изменения 0 .. 65535.

Тип longint - длинное целое размером 4 байта со знаком, пределы изменения

- 2 147 483 648 .. 2 147 483 647.

Для типа longint предопределена константа MaxLongint, равная - 1 = 2147483647.

Для целых значений допустимы следующие арифметические операции:

+ сложение;

- вычитание;

* умножение;

div деление нацело (целая часть от деления);

mod остаток от деления.

Пример 2.

19 div 5 = 3; 19 mod 5 = 4

Очевидно, что a mod b = a - (a div b)  b

В арифметическом выражении не могут стоять рядом два знака операции. Например, нельзя писать a * -b. Здесь должно быть a * (-b).

Старшинство операций:

1) выражения в скобках;

2) *, div, mod (операции типа умножения);

3) +, - (операции типа сложения).

Операции одинакового старшинства выполняются слева направо.

Пример 3.

5 + 3 * 7 div 4 - 17 mod 3 = 5 + 5 - 2 = 8

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

Операции возведения в степень в Паскале нет. Для целых показателей степени эта операция может быть заменена многократным умножением. Более эффективный способ программной реализации операции возведения в степень рассмотрен в разделе «Вычисление степенной функции».

Целый результат дают следующие предописанные функции:

1) abs(i) - абсолютное значение целого аргумента i;

2) sqr(i) - квадрат значения целого аргумента i;

3) trunc(R) - целая часть вещественного значения R;

4) round(R) - целое значение, ближайшее к вещественному значению R.

Пример 4.

trunc(3.3) = 3; round(3.3) = 3;

trunc(3.5) = 3; round(3.5) = 4;

trunc(3.8) = 3; round(3.8) = 4;

trunc(-3.3) = -3; round(-3.3) = -3;

trunc(-3.8) = -3; round(-3.8) = -4.

Следовательно,

trunc(x) = sign(x) trunc(abs(x)); round(x) = sign(x) round(abs(x)),

где sign(x) = 1 при x > 0, sign(x) = 0 при x = 0 и sign(x) = -1 при x < 0.

Если i - целое, то succ(i) = i + 1; pred(i) = i - 1; ord(i) = i .

Целочисленным переменным можно присваивать значения не только десятичных, но и шестнадцатеричных констант. Отрицательные значения можно задавать, используя знак "-" или дополнительный код числа. В этом смысле приведенные ниже операторы для переменных i, k и l эквивалентны.

i:=-$5D; i:=$A3;

k:=-$7C0F; k:=$83F1;

l:=-$2BF01400; l:=$C40FEC00 .

Целочисленные переменные могут рассматриваться как битовые последовательности. В связи с этим к ним применимы следующие операции:

Shl k (Shift Left) – сдвиг влево на k разрядов;

Shr k (Shift Right) – сдвиг вправо на k разрядов;

Not – отрицание;

And – логическое умножение;

Or – логическое сложение;

Xor – исключающее ИЛИ.

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

Для положительных чисел операции «shl k» и «shr k» эквивалентны соответственно умножению и делению на .

Пример 5

Var m,n,p : integer;

................

p:=100; m:=p shl 2; n:=p shr 2;

Получим: m = 400; n = 25.

В двоичном представлении:

p = 0000 0000 0110 0100;

m = 0000 0001 1001 0000; n = 0000 0000 0001 1001.

При компиляции программы выражения типа р* и р div автоматически заменяются операциями сдвига.

Логические операции not, and, or, xor выполняются поразрядно (см. пример 5 в разделе «Представление информации в ПЭВМ»).

Рассмотрим теперь возможные способы определенич четности целочисленных переменных.

Вполне очевидно что целочисленная переменная k четная, если

k mod 2 = 0,

и нечетная, если

k mod 2 = 1.

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

Запишем последовательно в двоичном представлении числа 5, 6, 7, 8, 9:

0101

0110

0111

1000

1001

Из этой записи видно, что четность двоичного числа определяется значением последнего разряда (0 – четное, 1 – нечетное число). Следовательно, функция odd(k) анализирует лишь последний разряд числа. Это эквивалентно вычислению следующего выражения:

odd(k) k and 1 k and 00000001

Операция and – это логическая операция, mod – арифметическая, которая выполняется на порядок дольше по сравнению с логической операцией. Следовательно, использование функции odd(k) при определении четности повышает быстродействие программы (микрооптимизация программы).

3. Символьный тип данных (тип char). Обозначение char - это сокращение слова character (символ, 'kæriktə).

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

Пример 6. 'A', 'a', '8', '''' (апостроф как символ пишется дважды).

Вне зависимости от реализации, т.е. от конструкции конкретного транслятора, для символьного типа справедливы следующие допущения.

1) Десятичные цифры от '0' до '9' упорядочены в соответствии с их значениями и записаны одна за другой. Следовательно,

succ('5') = '6'; pred('5') = '4' .

2) Имеются все прописные буквы латинского алфавита от 'A' до 'Z'. Это множество упорядочено по алфавиту, но не обязательно связно. Следовательно, в любой реализации должно выполняться 'I' < 'J', но может не выполняться succ('I') = 'J'.

3) Могут быть строчные буквы латинского алфавита от 'a' до 'z'. Если это так, то это множество букв упорядочено по алфавиту, но не обязательно связно.

В таблице ASCII заданы как большие, так и малые латинские буквы, причем их последовательность непрерывная.

Для символьного типа определены две взаимно обратные функции преобразования ord и chr:

k = ord(ch) - порядковый номер символа ch;

ch = chr(k) - символ с порядковым номером k.

Очевидно, что

chr ( ord ( ch ) ) = ch ; ord ( chr ( k ) ) = k .

В последнем случае должно быть k = 0 .. 255 .

Рассмотрим содержательный смысл функций ord и chr на машинном уровне. Как уже отмечалось, внутреннее представление символа в байте памяти - это его порядковый номер по таблице ASCII. Например, для буквы "Ю" имеем #158, тогда содержимое байта равно 9E16 = 100111102 .

Примечание. «#» - это порядковый номер символа в таблице ASCII.

Если байт, содержащий значение 10011110, используется в программе при выводе результатов как символ, то печатается буква "Ю"; если этот байт используется как число, то печатается значение 158. Следовательно, функции ord и chr никакого преобразования содержимого байта не производят; они лишь разрешают программе по-разному трактовать это содержимое (как символ или как число).

Для символьного типа определены все операции отношения.

Считается, что ch1 < ch2, если ord(ch1) < ord(ch2), где ch1, ch2 - переменные символьного типа.

Соседние файлы в папке LecRus