назад

Отрицательные числа

Ранее было отмечено, что FFFFh фактически равно -1. Однако если перевести число FFFFh в десятичную форму, то получится 65535. Почему так происходит? Действительно ли FFFFh ведет себя как отрицательное число?

Пусть так, тогда если сложить FFFFh и 5, то должно получиться 4:

-h 5 FFFF
0004 0006

Похоже, Debug действительно обращается с FFFFh, как с -1. Рассмотрим механизм сложения чисел 5 и FFFFh, при суммировании "столбиком":

1111
0005 5 + (-1) = 4
+FFFF
10004

Если игнорировать единицу в старшем разряде, то получается правильный ответ 5 + (-1) = 4. Debug сохраняет четыре младшие цифры результата. Старший (пятый) разряд запоминается в специальной ячейке памяти и называется - "ПЕРЕПОЛНЕНИЕ".
 

FFFF -1
FFFE -2
FFFD -3
FFFC -4
FFFB -5
FFFA -6
FFF9 -7
FFF8 -8
FFF7 -9
FFF6 -A
FFF5 -B
FFF4 -C
FFF3 -D
FFF2 -E
FFF1 -F
FFF0 -10

Сложение чисел, больших чем 8000h дает переполнение.
Такие числа ведут себя аналогично отрицательным числам:

1111                 1111
0008 FFF0
+FFFA +8FFF
10002 8+(-6)=2 18FEF -10h+(-7001h)= -7011h

В последнем примере установлено соответствие чисел 8FEFh и -7011h. Как проверить справедливость этого утверждения? Ранее отмечалось, что FFFFh это (-1), значит FFFEh это (-2) и т.д. В приведенной таблице представлен ряд отрицательных чисел. Если ряд продолжить, то при достижении числа 8FEFh мы увидим его отрицательный эквивалент: -7011h.

Любой язык программирования позволяет оперировать двумя типами чисел: знаковыми и беззнаковыми. Представление числа зависит от конкретной ситуации. Например: FFFAh можно рассматривать как число без знака, и как отрицательное число -6. Если в программе нужны отрицательные числа, то диапазон 0 ... FFFFh делится на две части:
[0 ... 7FFFh] - положительные числа и [8000h ... FFFFh] - отрицательные числа.

Отрицательный аналог числа 8FEFh называется его дополнительным кодом, и выражается числом -7011h. Рассмотрим алгоритм нахождения дополнительного кода:

  1. Инвертировать исходное число, т.е. заменить все цифры числа на противоположные:
    F ® 0, E ® 1, D ® 2, C ® 3, B ® 4 и т.д. После инверсии 8FEFh выглядит так: 7010h.

  2. К инверсному числу добавить единицу: 7010h + 1 = 7011h. Получилось искомое число.

Если в программе используются только положительные числа, то область числовых значений ограничивается диапазоном: 0 ... FFFFh или 0 ... 65535.

Если в вычислениях требуются отрицательные числа, то предыдущий диапазон смещается в отрицательную область: -8000h ... 7FFFh или -32768 ... 32767.

Деление чисел на два типа весьма условно, и определяется в основном потребностями программиста. При этом микропроцессору совершенно безразлично, к каким типам мы относим те или иные числа.

 Упражнение №4

Вычислите дополнительный код следующих чисел:

FF00h, AD3Fh, 9000h, EDF4h, B348h.