Языки высокого уровня (Паскаль, Си, Бейсик и т.п.) не ориентированы на конкретный тип ЭВМ. Это означает, что программа, написанная, например, на языке Паскаль, должна решаться без изменений на ЭВМ любого типа, имеющей транслятор с данного языка. В связи с этим программиста практически не интересуют конкретные технические сведения о конструкции и особенностях функционирования отдельных устройств ЭВМ. Тем не менее для создания эффективной программы необходимо обладать некоторым минимальным объемом знаний о технических параметрах ЭВМ, на которой будет реализована эта программа, в частности о способах представления числовой и нечисловой информации.
В ПЭВМ, как и во многих машинах другого типа, минимальной единицей обрабатываемой информации является байт (byte). Байт состоит из 8 двоичных разрядов, или бит (bit, от слов BInary digiT - двоичная цифра). Биты нумеруются 0, 1, 2, 3, 4, 5, 6, 7. Биты 0..3 и 4..7 образуют два полубайта - левый и правый, представляемые как двоичные тетрады. При записи содержимого байта каждый полубайт обозначают одной шестнадцатеричной цифрой.
Возможные значения байта:
0000 0000 = 00
0000 0001 = 01
0000 0010 = 02
................
1111 1111 = FF16 = 25510.
Следовательно, байт может принимать 256 различных значений.
Соответствие между кодовыми комбинациями байта и символами, реализуемыми на ПЭВМ, отображается в кодовой таблице ASCII. В этой таблице представлены латинские и русские буквы, цифры, знаки операций и др. Например, цифре 6 соответствует кодовая комбинация 00110110 ( ), букве K - код 01001011 (4B16) и т.д.
Каждый байт в памяти ЭВМ имеет свой номер (адрес). Адреса изменяются последовательно от 0 до некоторого максимального значения, определяемого объемом памяти ЭВМ. Объем памяти измеряют в килобайтах, мегабайтах, гигабайтах.
1 Kбайт = байт = 1024 байта;
1 Мбайт = Kбайт = байт;
1 Гбайт = Мбайт = байт.
Для ПЭВМ, имеющей объем памяти 1 Мбайт, максимальный адрес равен FFFFF (FFFFF = 100000 - 1 = - 1 = - 1).
Байты могут обрабатываться каждый отдельно или полями. Поле - это группа последовательных байтов. Длина поля равна количеству содержащихся в нем байтов. Адресом поля является адрес его крайнего левого байта. Некоторые поля имеют отдельные наименования: слово (поле длиной 2 байта), двойное слово (поле длиной 4 байта).
Все, что обрабатывает ЭВМ, обобщенно называют данными. К ним, в частности, относятся целые и вещественные числа, а также так называемые логические данные.
1. Целые числа (числа с фиксированной запятой).
ПЭВМ имеет несколько типов целых чисел, различающихся между собой количеством содержащихся в них разрядов. Здесь будет рассмотрен тип integer.
Для чисел типа integer отводится поле длиной 2 байта. Биты этого поля нумеруются в последовательности 0, 1, ... , 15. Нулевой бит, т.е. бит с нулевым порядковым номером содержит знак числа ("0" - это знак "+", "1" - знак "-").
Например, число 3104 = C20 в формате integer имеет вид
0C20 = 0000 1100 0010 0000
Здесь 16 c/c используется для компактного изображения двоичного числа.
Примечание. Поскольку число в формате integer имеет размер 2 байта, то шестнадцатеричная запись числа, применяемая для его компактного представления, должна всегда содержать 4 цифры. С этой целью в приведенном выше примере к шестнадцатеричной записи числа добавлен незначащий нуль.
Отрицательные числа с фиксированной запятой представлены в так называемом дополнительном коде.
Дополнительный код отрицательного числа - это его дополнение до такого числа, которое в этой же системе счисления представлено единицей и столькими нулями, сколько цифр имеет исходное число.
Пример 1.
10 c/c 16 c/c 2 c/c
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0
- 2 8 9 3 - A 5 4 C - 1 0 1 0
¾¾¾¾ ¾¾¾¾ ¾¾¾¾
8 1 0 7 5 A B 4 0 1 1 0
Существует более простое правило формирования дополнительного кода отрицательного числа: чтобы получить такой код, необходимо каждую цифру исходного отрицательного числа заменить ее дополнением до максимальной цифры в данной системе счисления, а затем добавить единицу к младшему разряду образовавшегося числа.
Для 10 c/c максимальная цифра - это 9, для 16 c/c - F, для 2 c/c - 1. Отметим, что для 2 c/c первый этап указанного преобразования сводится к инвертированию числа, т.е. замене нулей на единицы, а единиц - на нули.
Для числа -3104 в формате integer имеем F3E0. Для числа -58 = -003A получим FFC6.
Дополнительный код позволяет заменить операцию вычитания операцией сложения с дополнительным кодом отрицательного числа.
Пример 2. Пусть нам требуется выполнить в 10 c/c операцию
6 5 8 6 1
- 4 8 2 7 3
¾¾¾¾¾
1 7 5 8 8
Вместо вычитания числа 48273 выполним сложение с его дополнительным кодом:
6 5 8 6 1
+ 5 1 7 2 7
¾¾¾¾¾
| 1|1 7 5 8 8
Обведенная единица переноса выходит за пределы разрядной сетки и теряется. Следовательно, в обоих случаях мы получили одинаковые результаты.
Использование дополнительного кода позволяет отказаться от установки в процессоре блока вычитания, что упрощает его конструкцию.
Единица переноса из старших складываемых разрядов отбрасывается.
Результат: 8000 = - ( - 1) - 1 = - = - 32768 .
При анализе содержимого полей памяти ПЭВМ нередко возникает обратная задача: по дополнительному коду определить прямой код отрицательного числа. Здесь можно выполнить действия, обратные по отношению к описанным выше: вычесть единицу из младшего разряда, а затем заменить каждую цифру ее дополнением до максимальной цифры данной системы счисления. Однако проще воспользоваться следующим правилом: дополнительный код дополнительного кода есть прямой код числа. В этом случае исчезает необходимость выполнять операцию вычитания.
Пример 3 (для 16 с/с):
исходное число - 5B9538B6
дополнительный код A46AC74A
дополнительный код дополнительного кода - 5B9538B6