Прямой и дополнительный коды целых чисел. Их представление в памяти компьютера, сложение и вычитание
В электронной памяти числа всех типов (логические, целые (беззнаковые и со знаком), вещественные) всегда занимают целое число байтов. Минимальный объем памяти, занимаемый одним числом, равен одному байту (8 битам).
В формате “беззнаковое целое число” запись положительного целого числа представляет собой его двоичный код, размещенный в байтах, отведенных для него. При этом в одном байте можно разместить двоичные коды всех положительных чисел от 0(00000000) до 28–1= +255(11111111). Например, 001000102 = +3410,110011002 = +20410.
В формате “целое число со знаком” знак числа всегда задается в старшем разряде старшего байта: он равен 0 у положительных чисел и 1 у отрицательных. Остальные разряды записи заполняются в зависимости от типа кода. Основными являются прямой код и дополнительный.
Прямой код – это такое представление целого числа со знаком, в котором старший разряд старшего байта отводится под знак числа, а все оставшиеся разряды – под двоичную запись его абсолютной величины (модуля). Например, для однобайтового представления знак помещается в старшем разряде 7, а модуль – в разрядах с 0 по 6: 000010102 = +1010,100010102 = –1010.При этом диапазон значений охватывает от
(–12710) =111111112 до(+12710) =011111112.
Для общности прямым кодом беззнакового целого числа можно считать его двоичную запись. Сложение байтовых беззнаковых целых чисел производится по модулю числа 28 =256. При этом единичные значения, возникающие в разряде 8, выходящем за состав байта, отбрасываются. Например:
100101102 +011101112 =1000011012 =000011012 (mod 28).
Это свойство используется у беззнаковых целых чисел для замены операции вычитания операцией сложения чисел по следующему правилу:
a – b (mod 28) = a + (–b)(mod 28) = a + (28 – b)(mod 28).
Выражение (28–b) называют дополнительным кодом отрицательного числа (–b), соответствующего байтовому беззнаковому числу b. Его можно получить:
1) инвертированием двоичной записи всех разрядов числа b (при котором получается число вида 28 – 1 – b) и последующим
2) прибавлением к нему 1, после чего получаем искомую величину
(28 – b).
Дополнительный код положительного числа совпадает с прямым.
Пример 5. Выполнить вычитание (10–37) байтовых беззнаковых чисел с использованием дополнительного кода. Найти результат в дополнительном коде, а также его модуль в прямом коде.
Решение. Прямой двоичный код беззнакового числа 10 равен 000010102. Прямой код числа 37 равен 001001012. Найдем его дополнительный код:
Инверсия всех разрядов: 110110102. Добавление единицы: 110110112.
Результат сложения: 000010102 +110110112 =111001012.
Так как большее число вычиталось из меньшего, ответ отрицательный. Для определения абсолютной величины ответа переведем его в прямой код.
Вычитание: 111001002. Инвертирование: 000110112.
Полученное значение модуля результата равно 2710.
Ответ: а) 111001012, б) 000110112.
Пример 6. Выполнить вычитание (144–17) байтовых беззнаковых чисел с использованием дополнительного кода. Найти результат в дополнительном и прямом кодах.
Решение. Прямой двоичный код беззнакового числа 144 равен 100100002. Прямой код числа 17 равен 000100012. Найдем его дополнительный код:
Инверсия всех разрядов: 111011102. Добавление единицы: 111011112.
Результат сложения: 100100002 + 111011112 = 011111112.
Так как из большего числа вычиталось меньшее, ответ положительный. При этом результат получается в прямом коде, который совпадает с дополнительным. Полученное число равно 12710.
Ответ: а) 011111112, б) 011111112.
Сложение байтовых целых чисел со знаком производится по модулю числа 27 = 128(без учета старшего знакового разряда). При этом единичные значения, возникающие в знаковом старшем разряде 7, отбрасываются. Выражение (27 – b) является дополнительным кодом отрицательного числа со знаком, равного (–b). Практически дополнительный код отрицательного числа со знаком (–b) получается следующим образом:
1) занесением в старший знаковый разряд 7 значения 1, означающего отрицательное число;
2) инвертированием двоичной записи всех разрядов числа b помимо знакового старшего (при котором в данных разрядах будет получена запись числа 27 – 1 – b) и 3) прибавлением 1 к полученному в младших разрядах числу, после чего получаем в них искомую величину (27 – b).
При сложении чисел с одинаковым знаком этот же знак присваивается и результату. При сложении чисел с разными знаками в качестве знака результата принимается знак большего по модулю складываемого числа. Например, вычитание целых со знаком чисел (9610 – 2210) можно представить в виде сложения прямого кода первого числа с дополнительным кодом числа (–2210), причем знак результата совпадает со знаком большего по модулю первого числа. Учитывая, что дополнительный код числа
(–2210) = 11010102, получим:
9610 –2210 =9610 + (–22)10 =011000002 +111010102 =010010102=7410.
Двоичное 8-ми разрядное число со знаком в дополнительном коде может представлять любое целое в диапазоне от −128 до +127. Если результат вычитания является отрицательным числом, то он получается в дополнительном коде и для оценки модуля результата его переводят в прямой код.
Примеры байтового представления целых чисел со знаком:
Десятичное представление | Код байтового двоичного представления целых чисел со знаком | |
прямой | дополнительный | |
−0 | ||
−1 | ||
−3 | ||
−7 | ||
−8 | ||
−10 | ||
−127 | ||
−128 | --- |
Пример 7. Представить байтовое отрицательное число со знаком (−21) в а) прямом и б) дополнительном кодах.
Решение. Прямой код отрицательного числа со знаком (−21) равен его двоичной записи с единицей в старшем разряде: 100101012. Строим дополнительный код:
Инверсия его разрядов 0–6: 111010102.
Добавление единицы: 111010112.
Ответ: а) 100101012, б) 111010112.
Пример 8. Найти в дополнительном и прямом кодах результат вычитания (5–21) байтовых целых чисел со знаком с использованием дополнительного кода.
Решение. Из примера 7 берем дополнительный код отрицательного числа со знаком (−21): 111010112. Выполняя его сложение с прямым кодом положительного числа 5, получим дополнительный код итогового числа.
+11101011
Полученный дополнительный код переводим в прямой: Вычитание единицы: 111011112. Инверсия его разрядов 0–6: 100100002.
Получен прямой код отрицательного числа (–16).
Ответ: а) 111100002, б) 100100002.
Дата добавления: 2015-10-05; просмотров: 3867;