Ранее было отмечено, что 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. Рассмотрим алгоритм нахождения дополнительного кода:
Если в программе используются только положительные числа, то область числовых значений ограничивается диапазоном: 0 ... FFFFh или 0 ... 65535.
Если в вычислениях требуются отрицательные числа, то предыдущий диапазон смещается в отрицательную область: -8000h ... 7FFFh или -32768 ... 32767.
Деление чисел на два типа весьма условно, и определяется в основном потребностями программиста. При этом микропроцессору совершенно безразлично, к каким типам мы относим те или иные числа.
Упражнение №4
Вычислите дополнительный код следующих чисел:
FF00h, AD3Fh, 9000h,
EDF4h, B348h.