
- •Министерство образования и науки Российской Федерации
- •Цель лекции
- •План лекции
- •1 Происхождение вычислительных машин
- •2 Изучение алгоритмов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Биты и их хранение
- •2 Оперативная память
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Устройства внешней памяти
- •3 Хранение и поиск файлов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление числовых значений
- •2 Хранение целых чисел
- •3 Хранение дробей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление текста
- •2 Представление изображений
- •Достоинства пиксельной графики
- •Недостатки пиксельной графики
- •Достоинства векторной графики
- •Недостатки векторной графики
- •3 Представление звука
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Сжатие изображений
- •2 Ошибки передачи данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Архитектура эвм
- •2 Связь процессора с другими устройствами
- •3 Другие архитектуры
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Машинный язык
- •2 Пример машинного языка
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Выполнение программы
- •2 Пример выполнения программы
- •3 Программы и данные
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Логические операции
- •2 Операции сдвига
- •3 Арифметические операции
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция операционных систем
- •2 Архитектура операционных систем
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие процесса
- •2 Управление процессами
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Классификация сетей
- •2 Сетевые протоколы*
- •3 Безопасность сетей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие алгоритма
- •2 Представление алгоритма
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Теория решения задач
- •2 Общие методы решения задач
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритм последовательного поиска
- •2 Управление циклами
- •3 Алгоритм сортировки методом вставки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритмы поиска и сортировки
- •2 Управление рекурсией
- •3 Разработка рекурсивных процедур
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эффективность алгоритмов
- •2 Верификация программ
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция и классификация языков программирования
- •2 Концепции традиционного программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Процедурные единицы
- •2 Реализация языка программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Объектно-ориентированное программирование
- •2 Декларативное программирование
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структуры данных
- •Integer Scores (2.9).
- •2 Статические и динамические структуры
- •3 Указатели
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Массивы
- •2 Списки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структура и функции стека
- •2 Реализация стека
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Очереди
- •2 Деревья
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Пользовательские типы данных
- •Int Age;
- •2 Классы
- •Int *StackEntries;
- •3 Стандартная библиотека шаблонов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Роль операционной системы
- •2 Последовательные файлы
- •3 Вопросы программирования
- •0000000010000110
- •001100010011001100110100
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения индексации
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения хеширования
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Общие вопросы
- •2 Система управления базой данных
- •3 Поддержка целостности баз данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Модели баз данных
- •2 Реляционная модель баз данных
- •3 Объектно-ориентированные базы данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Интеллект и машины
- •2 Распознавание образов
- •3 Мышление
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Искусственные нейронные сети
- •2 Генетические алгоритмы
- •Контрольные вопросы
- •Невычислимые функции Цель лекции
- •План лекции
- •1 Основы машины Тьюринга
- •2 Невычислимая функция
- •3 Сложность задач
- •Листинг 1. Процедура MergeLists для объединения двух упорядоченных списков
- •Листинг 2. Алгоритм сортировки слиянием, реализованный в процедуре MergeSort
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Шифрование с открытым ключом
- •2 Модульная арифметика
- •Контрольные вопросы
- •Литература
- •Internet-ресурсы
2 Хранение целых чисел
Представление в двоичном дополнительном коде. Наиболее распространенной системой представления целых чисел в современных компьютерах является представление в двоичном дополнительном коде (two's complement notation). Эта система использует фиксированное число битов для представления числового значения. В современном оборудовании принято использовать представление, при котором каждому значению отводится 32 бита. Такой подход позволяет хранить большой диапазон чисел, однако его очень трудно изобразить наглядно. Поэтому мы сосредоточим наше внимание на коротких системах представления.
Два представления в двоичном дополнительном коде изображены на рис. 1.20. В основе одного лежит набор из трех битов, в основе другого — набор из четырех битов. Такая таблица кодов строится, начиная с цепочки, состоящей из одних нулей, затем отсчитываются значения до цепочки, состоящей из нуля, за которым следуют единицы. Эти наборы битов являются представлениями значений 0, 1, 2, 3 и т. д. Последовательности, которые являются кодами отрицательных чисел, начинаются с цепочки битов, состоящей из одних единиц. Затем отсчитываются в обратном порядке до цепочки, содержащей единицу, за которой следуют нули. Эти наборы битов представляют числа -1, -2, -3 и т. д. Если вам трудно считать в обратном порядке в двоичной системе счисления, просто начните считать с конца таблицы, с цепочки, состоящей из единицы и нулей, и считайте до цепочки, состоящей из единиц.
Обратите внимание на то, что в представлении в двоичном дополнительном коде крайний слева разряд обозначает знак числа. Поэтому его часто называют знаковым разрядом (sign bit). Знаковый разряд отрицательных чисел равен 1, а положительных чисел — 0.
Существует удобное соотношение между записью положительного и отрицательного чисел, одинаковых по модулю. Они совпадают, если их читать справа налево, до первой единицы включительно, а с этого места они являются дополнениями друг друга (дополнением набора битов (complement) является набор битов, который получается путем замены всех нулей на единицы и наоборот; например, 0110 и 1001 — дополнения друг друга). Например, в 4-битовом представлении (см. рис. 1.20) записи чисел 2 и -2 заканчиваются на 10, но запись числа 2 начинается с 00, а числа -2 — с 11. Это наблюдение помогает найти алгоритм для получения записи отрицательного числа из записи положительного и наоборот, когда эти числа равны по модулю. Мы просто переписываем исходную последовательность до тех пор, пока не будет переписана единица, затем мы переписываем оставшиеся разряды, заменяя их дополнениями (рис. 6). Обратите внимание, что самое маленькое отрицательное число в представлении в дополнительном коде не имеет положительного эквивалента.
Рисунок 6 – представление числа -6 в 4-х битовом дополнительном коде
Понимание основных свойств представления в двоичном дополнительном коде ведет к алгоритму его декодирования. Если знаковый бит записи равен 0, то нужно просто читать значение, как если бы эта последовательность была двоичной записью числа. Например, 0110 является представлением числа 6, потому что 110 является двоичной записью шести. Если знаковый разряд равен 1, значит, перед нами отрицательное число и нам остается только найти его модуль. Переписываем исходную последовательность справа налево, пока не будет переписана 1, затем переписываем оставшиеся биты, дополняя их. И, наконец, расшифровываем полученную последовательность, как если бы она была двоичной записью числа.
Например, для того чтобы перевести последовательность 1010 в десятичную систему счисления, мы сначала определяем, что перед нами отрицательное число, так как знаковый разряд равен 1. Следовательно, переписываем запись как ОНО. Определяем, что она является представлением числа 6, и делаем вывод о том, что исходный набор битов является представлением числа -6.
Сложение в двоичном дополнительном коде. Для сложения чисел в двоичном дополнительном коде применяется такой же алгоритм, как для двоичного сложения, только в этом случае все коды, включая результат операции, будут иметь одинаковую длину. Это означает, что если в результате сложения появляется дополнительный бит с левого края, он будет отсечен. Именно поэтому 0101 и 0010 в сумме дают 0111, а сумма 0111 и 1011 равна 0010 (0111 + 1011 = 10010, которая усекается до 0010).
Рассмотрим три примера сложения в дополнительном коде (рис. 7). В каждом случае десятичная запись была представлена 4-битовым кодом, а результат сложения опять переведен в десятичную систему счисления.
Рисунок 7 – Примеры сложения чисел в двоичном дополнительном коде
Обратите внимание, что если бы мы использовали традиционные методы вычисления, которые изучали в школе, то в третьем примере нам бы потребовалась совсем другая операция (вычитание). С другой стороны, в двоичном дополнительном коде мы можем вычислить результат, во всех случаях применяя алгоритм сложения. В этом и состоит главное преимущество представления в двоичном дополнительном коде: сложение любых комбинаций положительных и отрицательных чисел может быть выполнено с использованием одного алгоритма и, следовательно, одной схемы.
В отличие от школьников, которые сначала должны научиться сложению, а затем вычитанию, машине, в которой используется представление в двоичном дополнительном коде, нужно научиться выполнять только операции сложения и отрицания. Например, операция вычитания 7-5 аналогична операции сложения 7 + (-5). Следовательно, если потребуется вычесть 5 (с кодом 0101) из 7 (с кодом 0111), то машина, прежде всего, заменит 5 на —5 (с кодом 1011) и затем выполнит операцию сложения, результатом которой будет 0010, то есть код числа 2:
Мы видим, что если для представления чисел используется двоичный дополнительный код, то для выполнения операций сложения и вычитания достаточно комбинации схем сложения и отрицания (об этих схемах рассказывается в приложении Б).
Проблема переполнения. Одной из проблем, которых мы избегали в предшествующих примерах, но которые существуют в любом представлении в двоичном дополнительном коде, является ограничение на размер чисел, представимых данным количеством битов. Однако если мы используем 4-битовый двоичный дополнительный код, то у числа 9 не будет соответствующей записи. Это означает, что мы не получим правильного ответа, выполнив операцию сложения 5 + 4. На самом деле мы получим ответ — 7. Такая ошибка называется переполнением (overflow), она возникает тогда, когда нужно сохранить число, не попадающее в диапазон чисел, которые могут быть представлены в двоичном дополнительном коде. Переполнение может возникнуть, когда нужно сложить два положительных или два отрицательных числа. В обоих случаях можно проверить, есть ли ошибка, посмотрев на знаковый разряд полученного результата, то есть переполнение возникло, если сумма двух положительных чисел имеет код отрицательного числа или сумма двух отрицательных чисел имеет код положительного числа.
Конечно, поскольку большинство машин манипулируют более длинными последовательностями битов, чем те, которые мы обсуждали, операции с большими числами не вызывают переполнения. Сегодня принято использовать 32-битовые последовательности для хранения чисел в двоичном дополнительном коде, что позволяет порождать числа до 2 147 438 647, прежде чем возникнет переполнение. Если нужно записать большее число, то можно использовать более длинный код или можно изменить единицы измерения. Например, использование в расчетах миль, а не дюймов позволит уменьшить размер чисел и достичь необходимой точности вычислений.
Суть проблемы состоит в том, что компьютер может ошибаться, и пользователь должен знать о возможной опасности такой ошибки. Программисты и пользователи стали слишком самоуверенными и игнорируют тот факт, что маленькие числа могут складываться и порождать большие. Например, раньше было принято использовать 16-битовый двоичный код, который означал, что переполнение не возникнет, пока не появится значение 215 = 32 768. Девятнадцатого сентября 1989 года компьютерная система в госпитале допустила ошибку после долгих лет надежной работы. Исследование показало, что тот день был 32 768-м днем после 1 января 1900 года. Как вы думаете, какова цена этой ошибки?
Представление с избытком. Другой способ представления целочисленных значений называется представлением с избытком* (excess notation). Коды, соответствующие числовым значениям, имеют одинаковую длину. Для того чтобы составить таблицу кодов, сначала нужно выбрать длину последовательности битов, затем выписывать эти наборы в прямом порядке. Можно заметить, что код с одной 1 в позиции старшего разряда находится примерно посередине списка. Пусть он будет представлением нуля; коды до него используются для представления 1, 2, 3 и т. д., коды после него используются для -1, -2, -3 и т. д. Окончательный вариант таблицы 4-битовых кодов изображен на рис. 8. Можно заметить, что число 5 имеет код 1101, а число -5 имеет код 0011. Обратите внимание на то, что различие между представлением в двоичном дополнительном коде и избыточном коде заключается в том, что знаковый разряд у них имеет противоположное значение.
-
Набор битов
Значение
1111
7
1110
6
1101
5
1100
4
1011
3
1010
2
1001
1
1000
0
0111
-1
0110
-2
0101
-3
0100
-4
0011
-5
0010
-6
0001
-7
0000
-8
Рисунок 8 - Представление с избытком 8
Таблица кодов, изображенная на рис. 8 называется представлением с избытком восемь. Для того чтобы понять, почему это так, сначала переведите коды из таблицы в десятичную систему счисления, как обычный двоичный код, и сравните полученные значения со значениями в таблице. В каждом случае вы обнаружите, что полученный результат превосходит код в представлении с избытком на восемь. Например, последовательность 1100 в двоичной системе является кодом 12, но в представлении с избытком она является кодом 4; последовательность 0000 в двоичной системе является кодом 0, а в представлении с избытком — кодом 8. Точно так же 5-битовое представление с избытком будет называться представлением с избытком 16, так как, например, последовательность 10000 будет кодом 0, а не 16, как в двоичной записи. Вы можете убедиться, что 3-битовое представление с избытком является представлением с избытком четыре (рис. 9).
-
Набор битов
Значение
111
3
110
2
101
1
100
0
011
-1
010
-2
001
-3
000
-4
Рисунок 9 - 3-битовое представление с избытком