3.12. ПРЕДСТАВЛЕНИЕ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ В CЧ С НАТУРАЛЬНЫМ ОСНОВАНИЕМ.




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

Посколько отрицательные числа автоматически не появляются то мы должны вводить
специальные схемы для их описания.


Прямой код

Прямой код ----------- старший разряд числа показывает знак остальные разряды содержат число например 0101 5 {2, прям} 1101 -5 {2, прям} для троичного случая (обычная троичная система): 0101 10 {3, прям} 1XXX не используется 2101 -10 {3, прям} для четверичной системы: 0101 17 {4, прям} 1101 81 {4, прям} 2101 -81 {4, прям} 3101 -17 {4, прям} для пятичной системы: 0101 26 {5, прям} 1101 151 {5, прям} 2XXX не используется 3101 -151 {5, прям} 4101 -26 {5, прям} Прямой код содержит два представления для 0 0000 +0 {2, прям} 1000 -0 {2, прям} - - - - - 0000 +0 {3, прям} 2000 -0 {3, прям} Пользоваться прямым кодом неудобно, т.к даже схема сложения должна учитывать знак числа: Например: 5 + 2 0101 5 {2} + 0010 2 {2} --------- 0111 7 {2} но 5 + (-2): 0101 5 {2, прям} + 1010 -2 {2, прям} --------- 1111 -7 {2, прям} и даже 5 + (-0) 0101 5 {2, прям} 1000 -0 {2, прям} ---------- 1101 -5 {2, прям} соответсвенно схемы для арифметических операций получаются сложными. Кольцо для прямого кода (СЧ 2):


Смещенный код

Смещенный код ------------- Рассмотрим двоичный случай Примем за 0 число вида 10..00 Тогда отрицательные числа естественным образом меньше а положительные больше Пример: 0000 -8 0001 -7 ... 0111 -1 1000 0 <---- 1001 1 .... 1111 7 В троичном случае можем взять 1111 как базу 1101 -3 1102 -2 1110 -1 1111 0 <---- 1112 1 1120 2 1121 3 Недостаток: положительные числа не совпадают с прямым кодом.


Обратный код

Обратный код ------------- -X = NOT(X) т.е. отрицательное число - это инвертированное положительное Например двоичный случай: 0101 5 {2, обр} 1010 -5 {2, обр} В двоичном случае обратный код называют дополнением до 1 (потому что если сложить X и -X в каждом разряде будет 1: 0101 5 {2, обр} + 1010 -5 {2, обр} ------ 1111 -0 {2, обр} для троичного случая 0101 10 {3, обр} 2121 -10 {3, обр} Соответсвенно в троичном случае обратный код будет дополнением до 2 (если сложить X и -X то в каждом разряде будет 2): 0101 10 {3, обр} + 2121 -10 {3, обр} ------ 2222 -0 {3, обр} т.е. A + (-A) = P^N - 1, где P - основание системы счистления, а N - разрядность сетки представления чисел. Обратный код также как прямой содержит два представления для 0: 0000 +0 {2, обр} 1111 -0 {2, обр} - - - - - 0000 +0 {7, обр} 6666 -0 {7, обр} Обратным кодом тоже пользоваться неудобно, хотя A + (-A) = - 0, но 0101 5 {2, обр} + 1111 -0 {2, обр} ------ 0100 4 {2, обр} и 0101 5 {2, обр} + 1110 -1 {2, обр} ---- 0011 3 {2, обр} т.е. схемы для арифметических операций тоже получаются довольно сложными Кольцо для обратного кода (СЧ 2):


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

Дополнительный код ------------------- -X = NOT(X) + 1 таким образом: A + (-A) = P^N что упрощаяет контруирование сумматоров (т.к. и сложение и вычитание чисел можно производить на одном и том же оборудовании). для двоичного случая: X 01100 12 {2} NOT(X) 10011 {2} -X 10100 -12 {2, доп} проверим: |01100| + |10100| -------------- 1|00000| - получаем в результате 0. поэтому двоичный случай еще называют дополнением до двух. теперь для троичного случая: X 0101 10 {3} NOT(X) 2121 -X 2122 -10 {3, доп} проверяем: |0101| + |2122| ----------- 1|0000| - получаем в результате 0 дополнительный код в троичномм случае является дополнением до 3 дополнительный код содержит только один 0 - который имеет вид: 000...0000 (все разряды равны 0) отрицательные числа имеют вид 1xx...xxxx положительные числа имеют вид 0xx...xxxx дополнительный код (мы сейчас рассмотрим только двоичный случай) имет одно исключительное число вида 100...0000 (старший бит = 1, остальные 0), это число -2^(N-1), где N - разрядность сетки 1000 -8 {2, доп} 10000000 -128 {2, доп} положительное число с таким же модулем не представимо в сетке и мы получаем: X 1000 NOT(X) 0111 -X 1000 т.е. специальный случай, когда -X = X a все остальное хорошо: для сложения простая схема, 0 только один - поэтому в наше время для пресдставления отрицательных чисел используется практически исключительно\ дополнительный код. Кольцо для дополнительного кода (СЧ 2):




Сравнение кодов



------------------------------------------------------- sign 1's 2's magnitude complement complement ------------------------------------------------------- Прямой Дополнение Дополнение код до 1 до 2 ------------------------------------------------------- Прямой Обратный Дополнительный Смещенный код код код код ------------------------------------------------------- 0111 +7 +7 +7 -1 0110 +6 +6 +6 -2 0101 +5 +5 +5 -3 0100 +4 +4 +4 -4 0011 +3 +3 +3 -5 0010 +2 +2 +2 -6 0001 +1 +1 +1 -7 0000 +0 +0 0 -8 1000 -0 -7 -8 0 1001 -1 -6 -7 +1 1010 -2 -5 -6 +2 1011 -3 -4 -5 +3 1100 -4 -3 -4 +4 1101 -5 -2 -3 +5 1110 -6 -1 -2 +6 1111 -7 -0 -1 +7 ------------------------------------------------------- ------------------------------------------ Число Прямой Обратный Дополнительный ------------------------------------------ +7 0111 0111 0111 +6 0110 0110 0110 +5 0101 0101 0101 +4 0100 0100 0100 +3 0011 0011 0011 +2 0010 0010 0010 +1 0001 0001 0001 +0 0000 0000 0000 -0 1000 1111 ---- -1 1001 1110 1111 -2 1010 1101 1110 -3 1011 1100 1101 -4 1100 1011 1100 -5 1101 1010 1011 -6 1110 1001 1010 -7 1111 1000 1001 -8 ---- ---- 1000 ------------------------------------------


Арифметика в дополнительном коде





Пример кольца двоичных чисел:

Сложение:

Вычитание:

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



Флаги:

CF (Carry Flag) флаг переноса устанавливается если проходим через границу 00..00/11..11 т.е. когда происходит перенос/заем в/из границы адрессной сетки (беззнаковое переполнение) OF (Overflow Flag) флаг переполнения устанавливается если проходим через границу 01..11/10..00 т.е. когда не умещаемся в отрицательные или положительные числа в пределах нашей сетки (знаковое переполнение) ZF (Zero Flag) флаг нуля устанавливается если результат равен нулю.


Арифметика с насышением

Арифметика с насышением:

Результат не может перейти границу переполнения В этом случае он устанавливается равным границе. Арифметика с насыщением / \ Знаковая Беззнаковая Signed Unsigned Saturation Saturation 8E C0 + 8E + C0 ---- ---- 80 FF 7F C0 + 7F - F0 ---- ---- 7F 00

Index Prev Next