Сложение и вычитание
Выполнение арифметических действий над целыми числами компьютером
Диапазоны значений целых чисел со знаком
Формат числа в байтах | Диапазон | |
Запись с порядком | Обычная запись | |
–27 ... 27–1 | –128 ... 127 | |
–215 ... 215–1 | –32768 ... 32767 | |
–231 ... 231–1 | –2147483648 ... 2147483647 |
Рассмотрим особенности записи целых чисел со знаком на примере однобайтового формата, при котором для знака отводится один разряд, а для цифр абсолютной величины – семь разрядов.
В компьютерной технике применяются три формы записи (кодирования) целых чисел со знаком: прямой код, обратный код, дополнительный код. |
Последние две формы применяются особенно широко, так как позволяют упростить конструкцию арифметико-логического устройства компьютера путем замены разнообразных арифметических операций операцией cложения.
Положительные числа в прямом, обратном и дополнительном кодах изображаются одинаково — двоичными кодами с цифрой 0 в знаковом разряде.
Отрицательные числа в прямом, обратном и дополнительном кодах имеют разное изображение.
1. Прямой код. В знаковый разряд помещается цифра 1, а в разряды цифровой части числа — двоичный код его абсолютной величины. Например: -538 =101010112.
2. Обратный код. Получается инвертированием всех цифр двоичного кода абсолютной величины числа, включая разряд знака: нули заменяются единицами, а единицы — нулями. Например: -538 = 010101002.
3. Дополнительный код. Получается образованием обратного кода с последующим прибавлением единицы к его младшему разряду.
Например: -538 =
010101002
+ 000000012
¾¾¾¾¾¾
= 010101012
Обычно отрицательные десятичные числа при вводе в машину автоматически преобразуются в обратный или дополнительный двоичный код и в таком виде хранятся, перемещаются и участвуют в операциях. При выводе таких чисел из машины происходит обратное преобразование в отрицательные десятичные числа. |
В большинстве компьютеров операция вычитания не используется. Вместо нее производится сложение уменьшаемого с обратным или дополнительным кодом вычитаемого. Это позволяет существенно упростить конструкцию АЛУ. |
При сложении двоичных кодов чисел А и В имеют место четыре основных и два особых случая:
1. Числа А и В положительные. При суммировании складываются все разряды, включая разряд знака. Так как знаковые разряды положительных слагаемых равны нулю, разряд знака суммы тоже равен нулю.
Например: A= 538 , B = 128
538 +128 =001010112 + 000010102 = 001101012 = 658
001010112
+ 000010102
¾¾¾¾¾¾
= 001101012
Здесь получен правильный результат.
2. А положительное, число B отрицательное и по абсолютной величине больше, чем А. Например: 128 +( – 538 ) = – 418 = 000010102 + 010101002 =010111102
000010102
+ 010101002
¾¾¾¾¾¾
= 010111102
Получен правильный результат в обратном коде. При переводе числа в прямой код биты цифровой части результата инвертируются, т.е. 101000012= – 418 :
010111102 à 101000012
3. А положительное, число B отрицательное и по абсолютной величине меньше, чем А.
Например: 538 +( -128 ) = 418 = 001010112 + 011101012 = 101000002
001010112
+ 011101012
¾¾¾¾¾¾
= 101000002
Компьютер исправляет полученный неправильный результат в прямом коде (– 408 вместо 418) переносом единицы из знакового разряда в младший разряд суммы:
101000002 à 001000012
4. Числа А и В отрицательные.
Например: (–58) + (–58) = –128 = 011110102 + 011110102 = 111101002
011110102
+ 011110102
¾¾¾¾¾¾
= 111101002
Полученный первоначально неправильный результат (получен обратный код числа –138 вместо обратного кода числа –128) компьютер исправляет ошибку переносом единицы из знакового разряда в младший разряд суммы:
111101002 à (перенос 1) à 011101012 (обратный код числа)
При переводе результата в прямой код биты цифровой части числа инвертируются: 011101012 à 100010102 (прямой код) = –128 = –1010
При сложении может возникнуть ситуация, когда старшие разряды результата операции не помещаются в отведенной для него ячейке памяти. Такая ситуация называется переполнением разрядной сетки формата числа. Для обнаружения переполнения и оповещения о возникшей ошибке в компьютере используются специальные средства. Ниже приведены два возможных случая переполнения.
5. Числа А и В положительные, но сумма А+В больше, либо равна 2n–1, где n – количество разрядов формата чисел ( для однобайтового формата n=8, 2n–1 =27=128). Например: 1208 + 1228 = 010100002 + 010100102 =101000102= 2428
010100002
+ 010100102
¾¾¾¾¾¾
= 101000102
Семи разрядов цифровой части числового формата недостаточно для размещения восьмиразрядной суммы (2428 = 101000102), поэтому старший разряд суммы оказывается в знаковом разряде. Это вызывает несовпадение знака суммы и знаков слагаемых, что является свидетельством переполнения разрядной сетки.
6. Числа А и В отрицательные, а сумма абсолютных величин А и В больше, либо равна 2n–1 , где n – количество разрядов формата чисел. В этом случае также знак суммы не совпадает со знаками слагаемых, что будет свидетельствовать о переполнении разрядной сетки.