logo
AOM / Мельник А

6.4.2. Додавання двійкових чисел із знаками

Як ми вже бачили в попередньому розділі, існує чотири методи представлення п-роз-рядних чисел із знаками: в прямому, оберненому та доповняльному кодах, а також із зміщенням. В прямому коді старший розряд представляє знак числа, а наступні n-1 роз­ряди представляють модуль числа. В оберненому та доповняльному кодах додатні числа мають те ж саме представлення, що і в прямому. Представлення ж від'ємних чисел тут є іншим. В оберненому коді від'ємні числа представляються шляхом інверсії їх розря­дів, а в доповняльному коді крім того до молодшого розряду оберненого коду додається одиниця. В представленні із зміщенням всі числа, як додатні так і від'ємні, додаються до зміщення і отримані суми представляються як звичайні числа без знаків. Так від'ємне число kбуде представлене як k+b> = 0, де b- зміщення. Типовим значенням зміщення вибирається число 2n- 1.

Приклад: використовуючії чотирирозрядну сітку (n = 4), представимо в описаних вище кодах число k = - 3 (або в двійковій системі k = - 0112). В прямому коді k= 10112, причому старший розряд є знаковий. В оберненому коді k=11002 , а в доповняльному коді k= 11012. Для системи із зміщенням, коли зміщення Ь=2n - 1=8, маємо k= 01012.

Додавання чисел, представлених в прямому коді, вимагає проведення початкового аналізу знаків чисел. Якщо знаки однакові, то модулі чисел додаються, а результату при­своюється їх знак до проведення додавання. Якщо ж їх знаки різні, то модулі чисел відні­маються, а результату присвоюється знак більшого за модулем числа, або знак "+", якщо модулі чисел є рівними.

Додавання чисел, представлених в оберненому та прямому кодах, не залежить від 'їх знаків і проводиться так само як додавання додатних чисел в прямому коді з тією різ­ницею, що при додаванні чисел, представлених в оберненому коді, необхідно перенос з старшого розряду подавати на вхід переносу молодшого розряду. Представлення в до­повняльному коді використовується значно ширше, ніж в оберненому, оскільки при до­даванні чисел тут перенос із старшого розряду просто ігнорується. Наприклад, додавши 5+(-2) в доповняльному коді маємо 01012 + 11102 = 00112. Тобто отриманий правильний результат 3 при ігноруванні переносом із старшого розряду. Якщо ж додати ті ж самі числа в оберненому коді отримаємо 01012 + 11012 + 1 = 00112. Тобто також отриманий правильний результат 3 при врахуванні переносу із старшого розряду. Цей перенос називається циклічним. Додавання до отриманої суми одиниці циклічного переносу не викликає повторного циклічного переносу Наведений приклад наглядно ілюструє рис. 6.10.

213

Крім того, потрібно зауважити, що в доповняльному коді для представлення нуля існує лише один код - всі нулі, тоді як в оберненому коді два - всі нулі та всі одиниці, що призводить до неоднозначностей.

При виконанні додавання двійкових чисел можливе переповнення, коли отримана сума перевищує діапазон представлення чисел, тобто коли вона виходить за межі роз­рядної сітки. Для інформування програміста про отримання неправильного результа­ту переповнення повинно бути зафіксованим. Для фіксації переповнення аналізуються знакові розряди чисел. Переповнення виникає тільки при додаванні чисел з однаковими знаками і виявити його можна порівнюючи знаки суми і доданків. При переповненні знак суми Sне дорівнює знакам доданків х та у, тобто Signx=Signy=/SignS.

Для спрощення фіксування наявності переповнення використовуються так звані модифіковані коди з двома знаковими розрядами (тобто 0 представляється як 00, а 1 представляється як 11). Неоднаковість цих розрядів після виконання операції означає наявність переповнення, як це показано на прикладах на рис. 6.11.

В першому прикладі відбулося переповнення, оскільки два перші розряди, які пред­ставляють знак, не є однаковими.