- •Дополнительный код для представления целых чисел со знаком Числа без знака
- •Числа со знаком
- •Свойства дополнительного кода
- •Ещё два свойства дополнительного кода
- •Перенос и переполнение
- •Почему "дополнительный"
- •Знак числа в дополнительном коде
- •Число двойной точности
- •Определение
- •[Править]Аксиомы
- •[Править]Логические операции
- •[Править]Свойства логических операций
- •Имена (идентификаторы)
- •Объявления переменных
- •Операции присваивания
- •28) Разветвляющийся вычислительный процесс (if else)
- •Блок-схема алгоритма поиска корня уравнения методом половинного деления (дихотомии)
- •34,35) Операторы цикла
- •Цикл с предусловием while
- •Цикл с постусловием repeat
- •Цикл с параметром for
- •Рекомендации по использованию циклов
- •Процедуры передачи управления
- •36) " Массивы в языке с. "
- •2. Поиск минимального и максимального элементов в массиве
- •40) Индексирование
Ещё два свойства дополнительного кода
Можно сформулировать ещё два свойства дополнительного кода:
5) количество отрицательных чисел равно количеству неотрицательных чисел (включая ноль); положительных чисел на одно меньше, чем отрицательных1)
6) чтобы получить равное по абсолютной величине число обратного знака, следует заменить все нули в слове на единицы, а все единицы на нули и к полученному числу прибавить единицу.
Количество всех (отрицательных и неотрицательных) чисел равно 2n, где n -- количество разрядов в слове (в примере -- 2 разряда). Отрицательных чисел всего 2n-1, а положительных чисел, соответственно, 2n-1-1, плюс ещё одно особое число -- "машинный ноль".
___________
1) Положительных чисел было бы столько же, сколько отрицательных, но происходит переход старшего разряда в знаковый разряд. Поэтому приходится отказаться от "наибольшего положительного числа" и принять в качестве такового число, у которого все разряды, кроме старшего ("знакового") равны 1.
Перенос и переполнение
Как видно из проведённых выше примеров, в некоторых случаях операции над числами в дополнительном коде дают ошибочный результат. Эти случаи называются "переполнением". Название случая отражает то, что требуемый результат не может быть размещён в используемой разрядной сетке, или не входит в множество чисел со знаком данной разрядности.
При сложении чисел в дополнительном коде почти в половине случаев возникает перенос за разрядную сетку, причём результат сложения оказывается правильным . Переносом за разрядную сетку называют случай, при котором результат сложения не помещается в разрядную сетку слова (в примере -- двухразрядную). Эти случаи при операциях с числами в дополнительном коде, вообще говоря, не приводят к ошибочному результату. Более того, на игнорировании переноса за разрядную сетку основаны замечательные свойства дополнительного кода.
При подробном рассмотрении таблицы сложения двухразрядных чисел можно отметить, что ошибочный результат происходит в случаях, когда имеет место перенос за разрядную сетку, а переноса в старший (знаковый) разряд в процессе операции не происходит. И наоборот, при сложении происходит перенос в старший (знаковый) разряд, а переноса за разрядную сетку не происходит. Обозначая С -- логическое значение высказывания "Произошёл перенос за разрядную сетку", а С3 -- логическое значение высказывания "Произошёл перенос в знаковый разряд" , можно выразить логическое значение Ov высказывания "Произошло переполнение" следующей формулой:
Ov=(C&С3)|С&С3)=C][С3 ,
где обозначено: & -- операция "И", | -- операция "ИЛИ", ][ -- операция "Исключающее ИЛИ", черта сверху -- операция "НЕ".
Программисту микроЭВМ семейства mcs-51 нет нужды анализировать два переноса, так как факт переполнения в этой архитектуре при каждом сложении (вычитании) диагностируется аппаратно по приведённой формуле и отображается специальным битом OV в слове состояния программы.
Почему "дополнительный"
Рассмотренный код чисел без знака называют дополнительным, поскольку равные по абсолютной величине, но противоположные по знаку числа (противоположные числа) дополняют друг друга до числа, равного количеству всех чисел, которые можно записать в данном количестве разрядов слова. Для двухразрядных слов это число равно 4 (1 00 в двоичном коде), при восьмиразрядных слов (байтов) -- это 256 (1 0000 0000) и т.д. Дополнительность противоположных чисел -- это и есть свойство равенства машинному нулю суммы противоположных чисел (при отбрасывании переноса за разрядную сетку).
Часто дополнительный код путают с обратным кодом, в котором у противоположных чисел все разряды обращены (0 заменён на 1 и наоборот) . В архитектуре mcs-51 даже команда обращения всех битов регистра-аккумулятора называется CPL (compliment -- дополнить). На самом деле, обратный код отрицательных чисел отличается от дополнительного кода тех же чисел на единицу, и сумма противоположных чисел в обратном коде не равна машинному нулю.
