Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 2.doc
Скачиваний:
13
Добавлен:
29.05.2015
Размер:
194.56 Кб
Скачать

Дополнительный код

Ранее были рассмотрены только положительные двоичные числа. Но при вычислениях в двоичной системе, как и в десятичной, используются отрицательные числа. При выполнении операций в процессоре ЭВМ для представления отрицательных чисел используется дополнительный код.

Дополнительный код имеет ряд свойств, удобных для представления целых чисел со знаком. Эти свойства кажутся совершенно естественными, тем не менее, при других способах представления целых чисел со знаком они отсутствуют целиком или частично:

  1. отрицательные числа имеют значение старшего разряда слова ("знаковый разряд") 1, а положительные — 0;

  2. целое число 0 (ноль) представляется словом, все разряды которого равны нулю ("машинный ноль"), причём существует только один "машинный ноль";

  3. сложение чисел со знаком в дополнительном коде выполняется так же, как сложение чисел без знака, включая знаковый разряд, который при сложении ничем не отличается от других разрядов;

  4. сумма положительного и равного ему по абсолютному значению отрицательного числа равна машинному нулю. 

То есть, если машинные слова имеют фиксированные длину, то старший разряд используется как знаковый разряд. Если он равен ‘1’, то это отрицательное число.

Алгоритм формирования дополнительного кода для имеющегося числа в двоичной системе счисления прост и выполняется в два этапа:

  1. Имеющееся исходное число инвертируется;

  2. К полученному инвертированному числу прибавляется единица, то есть выполняется сложение инвертированного числа и 1.

Пример 7. Для исходного числа 0101 получить дополнительный код.

Решение. Выполняем два шага из алгоритма:

  1. Инвертирование: ~0101=1010.

  2. Сложение с 1: 1010+1=1011.

Для контроля можно получить дополнительный код для результата:

  1. Инвертирование: ~1011=0100.

  2. Сложение с 1: 0100+1=0101.

Исходное данное 01012 (510) превратилось в дополнительный код 10112 (–510), а он соответственно в 01012 (510). То есть произошел переход исходного данного в дополнительный код и обратно. Вероятно, что все операции были выполнены корректно.

По-другому можно провести проверку сложением исходного данного 01012 (510) с его дополнительным кодом 10112 (–510). В результате получаем:

|0101

+ |1011

1|0000

Отбрасывая разряды вышедшие за разрядную сетку получаем, что ответ равен 0. Это ещё раз подтверждает, что получен верный дополнительный код для заданного числа.

Рассмотрим теперь двухразрядные числа, то есть числа, записываемые в двухразрядном слове. Эти числа являются многоразрядными, и все полученные результаты могут быть распространены по индукции на числа любой разрядности.

Двухразрядных чисел всего четыре. Забегая вперёд, ранжируем все двухразрядные числа по нарастанию:

 

Отрицательные

Ноль

Поло- житель- ные

Двоичная запись

10

11

00

01

Значение в десятичной записи

-2 (минус два)

-1(минус один)

0(ноль)

+1(плюс один)

Из двух разрядов слова старший разряд "является знаком", а младший — отображает "значение числа". На самом деле, в дополнительном коде знак не может быть отделён от абсолютной величины. Именно всё слово целиком отображает в дополнительном коде одновременно и знак и абсолютную величину числа. Просто у отрицательных чисел старший (знаковый) разряд непременно равен единице.

На основе таблицы сложения одноразрядныхчиселсоставим полную таблицу сложения двухразрядных двоичных чисел:

+

00

01

10

11

00

00

01

10

11

01

01

10***)

11

100**)

10

10

11

100*)

100*)

11

11

100**)

100*)

100**)

*) 10 означает единицу в переносе из старшего разряда за пределы двухразрядной сетки, то есть количество разрядов  в сумме стало на один разряд больше, чем в каждом из слагаемых

**) Подчёркнутый старший (знаковый) разряд означает перенос в этот разряд в пределах двухразрядной сетки

***)Перечёркнутое число означает переполнение

 

Надо понимать, что для некоторых результатов здесь не хватает разрядов. Рассматривая полученные результаты можно сделать вывод, что проведённое чуть выше ранжирование двухразрядных чисел, сделано правильно, то есть:

  • 00 — это машинный ноль

  • 01 — "плюс один", единственное положительное число среди двухразрядных чисел со знаком

  • 11 и 10 — два отрицательных двухразрядных числа, "минус один" и "минус два".

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

Здравый смысл 

Получено по таблице

Перенос в знаковый разряд

Перенос за пределы разрядной сетки

Переполнение

"ноль"+"ноль"="ноль"

00+00=00

-

-

-

"ноль"+"один"="один"

00+01=01

-

-

-

"ноль"+"минус один"="минус один"

00+11=11

-

-

"ноль"+"минус два"="минус два"

00+10=10

-

-

-

"один"+"один"="два"

01+01=10

+

-

!

"один"+"минус один"="ноль"

01+11=100

+

+

-

"один"+"минус два"="минус один"

01+10=11

-

-

-

"минус один"+"минус один"="минус два"

11+11=110

+

+

-

"минус один"+"минус два"="минус три"

11+10=101

-

+

!

"минус два"+"минус два"="минус четыре"

10+10=100

-

+

!

Можно сформулировать ещёдва свойства дополнительного кода:

  • количество отрицательных чисел равно количеству неотрицательных чисел (включая ноль); положительных чисел на одно меньше, чем отрицательных1

  • чтобы получить равное по абсолютной величине число обратного знака, следует заменить все нули в слове на единицы, а все единицы на нули и к полученному числу прибавить единицу.

Количество всех (отрицательных и неотрицательных) чисел равно 2n, где n — количество разрядов в слове (в примере — 2 разряда). Отрицательных чисел всего 2n-1, а положительных чисел, соответственно, 2n-1-1, плюс ещё одно особое число — "машинный ноль". 

Пример 7. Для заданного положительного числа 0110 получить отрицательное число, то есть число в дополнительном коде.

Решение. Как описано выше заменяем все разряды на противоположные значения и добавляем единицу: 01101001; 1001 + 0001 = 1010. Для контроля можно сложить исходное число и результат: 0110 + 1010=10000, что в четырех разрядной записи есть ноль.

Таким образом, для выполнения вычитаний достаточно перевести число в дополнительный код и выполнить суммирование чисел.

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

  1. для увеличения разрядности числа приписывают слева старшие разряды;

  2. на новые разряды производят распространение знака, то есть:

    1. если исходное число положительно, то новые старшие разряды устанавливаются равными 0;

    2. если исходное число отрицательно (записано в дополнительном коде), то новые старшие разряды устанавливаются равными 1.

После такой процедуры исходные числа оказываются корректно записанными как на исходной разрядной сетке, так и на расширенной.

Пример 8. Выполнить умножение положительного числа 0111 на дополнительный код числа 0110 (на отрицательное число от этого).

Решение. Для получения дополнительного кода проделываем соответствующую процедуру. Как описано выше заменяем все разряды на противоположные значения и добавляем единицу: ~01101001; 1001 + 0001 = 1010. Теперь получим запись этих чисел на 8-ми разрядной сетке: 00000111 и 11111010 соответственно. Тогда их произведение будет равно:

11111010

* 00000111

11111010

11111010

11111010

11011010110

Отбрасываем разряды не вошедшие в разрядную сетку (отмеченные красным цветом) и получаем ответ — 11010110. Для контроля переведем получим дополнительный код: ~1101011000101001; 00101001 + 0001 = 00101010. Что в десятичной системе соответствует операциям над числами: 7 * (–6)= –42, а его дополнительный код есть 42.

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