Знаковые обратные двоичные коды
Обратные двоичные коды отличаются от прямых только тем, что отрицательные числа в них получаются инвертированием всех разрядов положительного числа. При этом обработка знакового и цифровых разрядов не различается. Алгоритм работы с такими кодами резко упрощается.
Тем не менее, при работе с обратными кодами требуется специальный алгоритм распознавания знака, вычисления абсолютного значения числа и восстановления знака результата числа. Кроме того, в прямом и обратном коде для представления числа 0 используются два разных кода, тогда, как известно, что число 0 положительное и отрицательным не может быть никогда. Формат 8-разрядного обратного знакового двоичного кода приведен на рис. 4.3. На рисунке приведено шесть различных чисел, записанных в этом коде.
Рис. 4.3. Формат 8-разрядного обратного знакового двоичного кода
Знаковые дополнительные двоичные коды
От перечисленных недостатков свободны дополнительные коды. Они позволяют суммировать положительные и отрицательные числа, не анализируя знаковый разряд, и при этом получать правильный результат. Все это становится возможным благодаря тому, что дополнительные числа являются естественным кольцом чисел, а не искусственным образованием, как прямые и обратные коды. Кроме того, немаловажным является то обстоятельство, что вычислять дополнение в двоичном коде чрезвычайно легко. Для этого достаточно к обратному коду добавить 1.
Формат 8-разрядного дополнительного знакового двоичного кода приведен на рис. 4.4. На рисунке приведено шесть различных чисел, записанных в этом коде.
Рис. 4.4. Формат 8-разрядного дополнительного знакового двоичного кода
Числа, которые можно представлять 8-разрядным дополнительным двоичным кодом, находятся в диапазоне от -128 до +127. Для 16-разрядного кода этот диапазон будет от -32768 до +32767. В 8-разрядном процессоре для хранения 16-разрядного числа используются две ячейки памяти, расположенные в соседних адресах.
В обратных и дополнительных кодах наблюдается интересная особенность, которая называется эффектом распространения знака: при преобразовании однобайтного числа в двухбайтное достаточно всем битам старшего байта присвоить значение знакового бита исходного байта. То есть для хранения знака числа можно использовать сколько угодно старших битов. При этом значение кода совершенно не изменяется. Эффект распространения знака используется при подключении таких устройств, как АЦП или ЦАП, к микропроцессору если их разрядности не совпадают.
Использование для представления знака числа двух битов предоставляет интересную возможность контролировать возникновение переполнения при выполнении арифметических операций. В качестве второго знакового бита используется флаг переноса С. Можно конечно использовать и большее количество знаковых битов, но это никаких дополнительных преимуществ не дает.
Рассмотрим несколько примеров работы с дополнительными двоичными кодами.
1. Просуммируем числа +12 и +5. Суммирование этих чисел в двоичном и десятичном представлении приведено на рис. 4.5.
Рис. 4.5. Суммирование чисел +12 и +5
В этом примере видно, что в результате суммирования получается правильный результат. Это можно проконтролировать по флагу переноса С, который совпадает со знаком результата (эффект распространения знака действует).
2. Просуммируем два отрицательных числа -12 и -5. Суммирование этих чисел в двоичном и десятичном представлении приведено на рис. 4.6.
Рис. 4.6. Суммирование чисел -12 и -5
В этом примере флаг переноса С тоже совпадает со знаком результата, т. е. переполнения не произошло и в этом случае.
3. Просуммируем положительное и отрицательное числа -12 и +5. Суммирование этих чисел в двоичном и десятичном представлении приведено на рис. 4.7.
Рис. 4.7. Суммирование чисел -12 и +5