Арифметика в дополнительном коде
2.5 Арифметика в дополнительном коде
МП использует числа в форме дополнительного кода потому, что он в состоянии выполнять операции сложения, инверсии и иккрементирование. МП не приспособлен для прямого вычитания. Он использует сумматоры и для выполнения вычитания оперирует над дополнительным кодом. В общем случае при сложении или вычитании чисел со знаком результат есть также число со знаком. Если при этом бит старшего разряда равен единице, то результат – отрицательное число в дополнительном коде.
Если требуется определить абсолютное значение результата, то его необходимо представить в обратном коде, а затем прибавить единицу.
Используя дополнительный код и сумматор МП выполняет вычитание, которое происходит следующим образом. Определяется дополнительный код вычитаемого и производится сложение этого кода с уменьшаемым. Если разность – число положительное (бит старшего разряда равен 0), то бит переноса необходимо отбросить; полученная последовательность битов и есть двоичный код результата. Если разность – число отрицательное (бит старшего разряда равен 1), то она представлена в дополнительном коде.
Рассмотрим примеры.
1. Вычислить разность чисел 58-23
а) Определение дополнительного кода числа 23
число 2310 00010111
Рекомендуемые материалы
обратный код 11101000
+
прибавляем единицу 00000001
дополнительный код числа 2310 11101001
б) Вычисление разности.
число 5810 00111010 58
+ -
11101001 23
Разность 3510 100100011 35
Получили положительный результат, поэтому единица переноса в девятый разряд отбрасывается.
2. Вычислить разность чисел 26-34
а) Определение дополнительного кода числа 34
число 3410 00100010
обратный код числа 11011101
+
прибавляем единицу 00000001
дополнительный код числа 3410 11011110
б) Вычисление разности:
26 00011010
- +
34 11011110
-08 11111000
Видно, что разность получилась в форме дополнительного кода, поскольку в старшем разряде 1.
в) Определение абсолютного значения разности.
дополнительный код разности 11111000
обратный код 00000111
+
прибавляем единицу 00000001
абсолютное значение разности 810 00001000
3. Сложить десятичные числа -210 и -510
210 00000010
обратный код 11111101
+
00000001
дополнительный код -210 11111110
510 00000101
11111010
+
00000001
дополнительный код 510 11111011
Числа в дополнительном коде складываются
-2 11111110
+ +
-5 11111011
-7 1 11111001
Старший бит
Старший бит результата является переполнением 8-разрядного регистра и им пренебрегаем. В 8-ом разряде стоит 1. Значит, получено отрицательное число в дополнительном коде.
Найдём абсолютное значение разности.
11111001
00000110
+
00000001
абсолютное значение разности 710 00000111
Двоичные умножение и деление
При умножении одного числа на другое одно из чисел называется множимым, другое – множителем. Ниже изображена таблица двоичного умножения. Аналогичную таблицу десятичного умножения, состоящую из 10 строк и 10 столбцов, мы знаем наизусть. По сравнению с ней таблица двоичного умножения чрезвычайно проста: в умножении участвуют цифры, принимающие только два значения – 0 или 1, в результате умножения перенос не возникает никогда.
* | Множимое | ||
0 | 1 | ||
Множитель | 0 | 0 | 0 |
1 | 0 | 1 |
Воспользуемся таблицей для вычисления произведения двоичных эквивалентов десятичных чисел 17 и 12.
Множимое 1710 10001
*
Множитель 1210 01100
00000
00000
10001
10001
00000
Результат 20410 11001100
Первые два частных произведения включают только нули, так как множители – значения первого и второго разрядов – равны нулю. Третье частное произведение – копия множимого. Разница между ними заключается лишь в том, что копия сдвинута относительно множимого на два двоичных разряда влево, поскольку для получения этого частного произведения в качестве множителя используется значение третьего разряда. Четвёртое частное произведение также является копией множимого смещённой относительно последнего на три двоичных разряда влево. Все остальные произведения – нули. Сложение всех частных произведений в данном примере не сопровождается переносом, однако возникновение последнего не исключено.
Обычно умножение и деление как отдельные операции в МП не предусматриваются. Эти операции выполняются с использованием специальной подпрограммы. Программно умножение реализуется путём сдвига и сложения. Перечислим правила этого способа.
1. Формирование первого частного произведения. Если значения младшего значащего разряда множителя равно 0, то и результат равен 0. Если значение этого разряда равно 1, то результат является копией множимого.
2. Правило сдвига. При использовании очередного разряда множителя для формирования частичного произведения производится сдвиг множимого на один разряд влево.
3. Правило сложения. Каждый раз, когда значение разряда множителя равно 1, к результату необходимо прибавлять множимое, расположенное в позиции, определённой правилом сдвига.
4. Искомое произведение есть результат выполнения всех операций сдвига и сложения.
Продемонстрируем правила сдвига и сложения на рассмотренном примере умножения 1710 и 1210:
10001
*
01100
10001 множимое, сдвинутое влево на 2 разряда
10001 множимое, сдвинутое влево на 3 разряда
11001100ять множимое расположено сумма сдвинутых множимых
Ещё пример: 93*45=4185
93 01011101
* *
45 00101101
01011101
01011101
01011101
01011101
418510= 1000001011001
Прокомментируем первый пример. При использовании первого разряда множителя множимое не смещается, а поскольку значение этого разряда равно нулю, то первое частичное произведение равно 0. Следовательно, равно нулю и текущее значение результата. При использовании второго разряда со значением равным 0, множимое сдвигается на один разряд влево, но сложение, как и в предыдущем случае, не выполняется. Значение третьего разряда множителя равно 1, поэтому множимое сдвигается ещё на один разряд влево, а затем добавляется в качестве слагаемого к текущему значению результата. При использовании четвёртого разряда, значение которого равно 1, осуществляется сдвиг множимого на один разряд влево по сравнению с его позицией после операции с третьим разрядом. Затем множимое добавляется к текущему значению результата. Поскольку остальные разряды множителя содержат нули, никаких добавлений к текущему значению результата больше не происходит.
Деление – это операция, обратная умножению. Иначе говоря, при делении операцию вычитания повторяют до тех пор, пока уменьшаемое не станет меньше вычитаемого. Число этих повторений показывает, сколько раз вычитаемое укладывается в уменьшаемом. Двоичное деление осуществляется аналогично десятичному.
Рассмотрим пример.
Разделить число 20410 на 1210
11001100 1100 11001100=20410
1100 10001 1100=1210
01100 10001=1710
01100
0
Двоичное деление начинается с анализа делимого и делителя. Сразу обнаруживаем, сто делитель точно укладывается в первые четыре цифры делимого, а потому записываем цифру 1 в поле, предоставленное для формирования частного. Умножаем делитель на 1 и вычитаем результат из 1100. Разность равна нулю, т.е. меньше делителя, а поэтому процесс деления можно продолжить. Объединяем нуль остатка со значением следующего разряда делимого, равным 1. Поскольку делитель укладывается ноль раз в числе 1, записываем 0 в поле представления частного, а число 1 объединяем со следующей цифрой делимого и т.д. Описываемая процедура продолжается до тех пор, пока делимое не оказывается исчерпанным.
Арифметика повышенной точности
Обсудим, как в МП реализуется арифметика повышенной точности. При работе с МП часто выясняется, что длина слов, которыми он оперирует, недостаточна для достижения требуемой точности вычислений. Например, 8-разрядный МП использует числа в диапазоне от -128 до +127. Для большинства задач такой диапазон неприемлем. Используя два 8-битовых слова с представлением отрицательных чисел в дополнительном коде, получим диапазон от
-32768 до 32767. Для решения многих задач указанной двойной точности этого вполне достаточно. Однако иногда требуется тройная точность вычислений: 1 бит для знака и 23 бит для абсолютной величины числа. Диапазон чисел в случае тройной точности следующий: -8388608 до 8388607, включая 0. Однако при работе с арифметикой повышенной точности требуется большой объем памяти для хранения данных и более интенсивная работа МП. Пусть например, необходимо использовать арифметику тройной точности в 8-разрядной вычислительной системе. Для этого необходимо сначала произвести обращение к младшему значащему байту каждого числа. После сложения двух байтов результат записывают в память, а возможные при этом переносы подлежат временному хранению. Затем из памяти извлекают следующие по значимости байты и складывают, прибавляя биты переноса, полученные в результате предыдущей операции сложения. Результат записывают в память на место специально зарезервированное для среднего байта суммы. Наконец из памяти извлекают старшие значащие байты, складывают их, к сумме добавляют биты переноса, полученные при предыдущей операции сложения, и результат записывают в область памяти, зарезервированную для старшего значащего байта суммы. Таким образом, требуется в три раза больше времени и объема памяти.
Арифметика чисел с плавающей точкой
Не все проблемы могут быть разрешены при использовании арифметики с повышенной точностью. До сих пор рассмотрение было ограничено целыми числами. Действия с дробными числами осуществляются в арифметике чисел с плавающей точкой (запятой), позволяющей МП отслеживать положение десятичной точки. Это достигается благодаря использованию представления десятичных дробей в нормализованном виде, т.е. в виде мантиссы, диапазон значений которой от 0,1 до 1, и порядка - показателя степени числа 10. Например, число 50 представляется как 0,5*102, а число -750 как -0,75*103.
Числа с плавающей точкой хранятся в МП так же как и целые числа. Записывается мантисса со знаком и порядок со знаком. Представление числа в форме с плавающей точкой в 8-разрядном МП можно изобразить следующим образом.
Адрес байта | Содержимое байта |
М+3 (4-й байт) | + или – 7-битовый порядок |
М+2 ( 3-й байт) | + или – 7 старших битов мантиссы |
М+1 (2-й байт) | 8 средних битов мантиссы |
Если Вам понравилась эта лекция, то понравится и эта - 11 - Характерные особенности рельефа. М (1-й байт) | 8 младших битов мантиссы |
Число в форме с плавающей точкой занимает 4 байт. Мантисса представлена как число тройной точности и занимает три байта. Старший бит третьего байта знаковый. Четвёртый байт занят порядком: 7 бит величины и 1 бит знака. Арифметика чисел с плавающей точкой позволяет оперировать числами от
-223×2127 до (223-1)×2127. Следовательно, диапазон чисел очень большой.