Що таке "Доповнення 2"?


434

Я перебуваю на курсах комп'ютерних систем і борюся , частково, з Доповненням двох . Я хочу це зрозуміти, але все, що я прочитав, не зблизило картину для мене. Я прочитав статтю у Вікіпедії та інші інші статті, включаючи свою текстову книгу .

Отже, я хотів запустити цю вікі- пост спільноти, щоб визначити, що таке Доповнення Двох, як ним користуватися та як воно може впливати на числа під час операцій, таких як касти (від підписаних до непідписаних та навпаки), бітових операцій та операцій з переміщенням бітів. .

Я сподіваюся на це чітке і стисле визначення, яке легко зрозуміти програмісту.

Відповіді:


627

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

Щоб зрозуміти, треба думати про числа у двійковій формі.

Це в основному говорить:

  • для нуля використовуйте всі 0.
  • для натуральних чисел почніть підрахунок, максимум з 2 (кількість біт - 1) -1.
  • для негативних цілих чисел зробіть точно те саме, але перемкніть роль 0 і 1 (тому замість того, щоб починати з 0000, починайте з 1111 - ось «доповнення»).

Давайте спробуємо це з міні-байтом у 4 біти (ми будемо називати це nibble - 1/2 a byte).

  • 0000 - нуль
  • 0001 - один
  • 0010 - два
  • 0011 - три
  • 0100до 0111- чотири-сім

Це наскільки ми можемо досягти позитивних результатів. 2 3 -1 = 7.

Для негативів:

  • 1111 - негативний
  • 1110 - негативні два
  • 1101 - негативні три
  • 1100до 1000- мінус чотири до мінус восьми

Зауважте, що ви отримуєте одне додаткове значення для негативів ( 1000= -8), яке не стосується позитивів. Це тому 0000, що використовується для нуля. Це може розглядатися як числова лінія комп'ютерів.

Розмежування позитивних і від’ємних чисел

Роблячи це, перший біт отримує роль біта "знака", оскільки його можна використовувати для розмежування негативних і від'ємних знаків десяткових знаків. Якщо найбільш значущим бітом є 1, то двійковим можна вважати негативним, де, як ніби найзначніший біт (крайній лівий) 0, ви можете сказати, що десяткове значення невід’ємне.

Від'ємне число "доповнення" просто перевертає біт знака, а потім нараховує число 0. Але цей підхід має справу з інтерпретацією 1000як "від'ємний нуль", який заплутаний. Як правило, про це потрібно турбуватися лише під час роботи близько до обладнання.


146
Напевно, найкраща частина доповнення двох - це те, як це спрощує математику. Спробуйте додати 2 (0010) та -2 (1110) разом, і ви отримаєте 10000. Найзначніший біт - це переповнення, тому результат насправді 0000. Майже як магія, 2 + -2 = 0.
Naaff

96
Ще одна перевага, крім простого додавання та віднімання, полягає в тому, що доповнення 2s має лише один нуль. Якщо ви використовували простий біт знаків, скажімо, використовуючи 0001 для позначення +1 і 1001 для представлення -1, у вас було б дві нулі: 0000 ("+0") і 1000 ("-0"). Це справжній біль ззаду.
Йорг W Міттаг

26
Оновіть його до суті, а також для пояснення, чому негативні значення мають більший діапазон від позитивних. Я прийшов шукати причину різниці діапазону.
Ешвін

2
Якщо ви не скажете "для від'ємних цілих чисел, зробіть точно те саме, але відлічіть і перемкніть роль 0 і 1"
Корай Тугай

1
Чудовий. Додано додаткові частини перетворення бітів у від’ємне ціле число.
Сурай Джайн

339

Цікаво, чи можна це пояснити краще, ніж стаття у Вікіпедії.

Основна проблема, яку ви намагаєтеся вирішити за допомогою представлення комплементу двох - проблема зберігання негативних цілих чисел.

Спочатку розглянемо непідписане ціле число, збережене в 4 бітах. Ви можете мати наступне

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Вони не підписані, оскільки немає вказівки на те, чи є вони негативними чи позитивними.

Знак величини та позначення надлишку

Щоб зберігати від’ємні числа, ви можете спробувати ряд речей. По-перше, ви можете використовувати позначення величини знака, яке призначає перший біт як бітовий знак, щоб представляти +/-, а решта бітів представляти величину. Отже, знову використовуйте 4 біти і припускаючи, що 1 означає - і 0 означає + тоді у вас є

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Отже, ви бачите там проблему? У нас є позитивні та негативні 0. Більшою проблемою є додавання та віднімання двійкових чисел. Схеми додавання і віднімання знаків величини будуть дуже складними.

Що

0010
1001 +
----

?

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

Тож разом йде двоє доповнення. Тепер ви можете зберігати додатні та від’ємні цілі числа та виконувати арифметику з відносною легкістю. Існує ряд методів перетворення числа в доповнення двох. Ось один.

Перетворити десяткове число в два

  1. Перетворіть число у двійкове (зараз ігноруйте знак), наприклад, 5 - 0101, а -5 - 0101

  2. Якщо число - це додатне число, то ви зробите. наприклад, 5 дорівнює 0101 у двійковій формі, використовуючи позначення доповнення двох.

  3. Якщо число від’ємне, то

    3.1 знайдіть доповнення (інвертування 0 і 1), наприклад -5 - 0101, тому пошук доповнення дорівнює 1010

    3.2 Додайте 1 до доповнення 1010 + 1 = 1011. Отже, -5 у двох доповненнях дорівнює 1011.

Отже, що робити, якщо ви хотіли зробити 2 + (-3) у двійковій? 2 + (-3) дорівнює -1. Що ви повинні зробити, якщо для додавання цих чисел ви використовували знакову величину? 0010 + 1101 =?

Використовуючи доповнення двох, подумайте, наскільки це було б просто.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Перетворення доповнення двох у десятковий

Перетворення 1111 в десятковий:

  1. Число починається з 1, тому воно негативне, тому ми знаходимо доповнення 1111, що становить 0000.

  2. Додаємо від 1 до 0000, і отримуємо 0001.

  3. Перетворіть 0001 в десятковий, що дорівнює 1.

  4. Нанесіть знак = -1.

Тада!


45
Найкраща відповідь на мій погляд.
Корай Тугай

5
так, цей досить простий і пояснює справу дуже добре
Макс Корецький,

3
Я не розумію, як додавання одного при перетворенні обох способів завжди призводить до одного і того ж числа. По-моєму, ти перевернув би кроки або відніс одне чи щось.
Маркос Перейра

2
Чому додати 1 до доповнення?
Зінан Сін

4
Цю відповідь слід використовувати у Вікіпедії.
Хірокі

119

Як і більшість пояснень , які я бачив, вище них є чітким уявленням про те , як працювати з 2 з доповненням, але на самому ділі не пояснити , що вони є математично. Я спробую це зробити, принаймні для цілих чисел, і я висвітлю деякий фон, який, мабуть, знайомий спочатку.

Згадайте, як це працює для десятків:
  2345
- це спосіб запису
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .

Таким же чином, двійковий - це спосіб запису чисел, використовуючи лише 0 і 1, слідуючи тій самій загальній ідеї, але замінюючи ці 10s вище двома. Тоді у двійковій формі
  1111
- це спосіб запису
  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0,
і якщо ви опрацюєте це, вийде рівний 15 (основа 10). Це тому, що це
  8 + 4 + 2 + 1 = 15.

Це все добре і добре для позитивних чисел. Це навіть працює для негативних чисел, якщо ви готові просто вставити знак мінус перед ними, як це роблять люди з десятковими числами. Це навіть можна зробити на комп’ютерах, на кшталт, але такого комп'ютера я не бачив з початку 1970-х. Я залишу причини для іншого обговорення.

Для комп’ютерів виявляється більш ефективним використовувати подання доповнення для від'ємних чисел. І ось щось, що часто не помічають. Позначення доповнення передбачають певне перевернення цифр числа, навіть мається на увазі нулі, що стають перед нормальним додатним числом. Це незручно, бо виникає питання: чи всі вони? Це може бути нескінченна кількість цифр, яку слід враховувати.

На щастя, комп'ютери не представляють нескінченності. Числа обмежуються певною довжиною (або шириною, якщо вам зручніше). Тож повернемось до позитивних двійкових чисел, але з певним розміром. Для цих прикладів я використаю 8 цифр ("біт"). Отже наше двійкове число дійсно було б
  00001111
або
  0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0

Для формування негативного доповнення 2 спочатку доповнюємо всі (двійкові) цифри до форми
  11110000
і додаємо 1 до форми
  11110001,
але як нам це зрозуміти, щоб означати -15?

Відповідь полягає в тому, що ми змінюємо значення біта високого порядку (крайнього лівого). Цей біт буде рівним 1 для всіх від’ємних чисел. Ця зміна полягатиме в тому, щоб змінити знак її внеску у значення числа, яке воно відображається. Отже, тепер наша 11110001 означає
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Зауважте, що "-" перед цим виразом? Це означає, що знаковий біт несе вагу -2 7 , тобто -128 (основа 10). Усі інші позиції зберігають ту саму вагу, яку вони мали у непідписаних двійкових числах.

Розробляючи наші -15, це
  -128 + 64 + 32 + 16 + 1
Спробуйте на своєму калькуляторі. це -15.

З трьох основних способів, за якими я бачив негативні числа, представлені на комп’ютерах, додаток 2 виграє руки для зручності загального користування. Однак це має дивацтво. Оскільки це двійкові, має бути рівномірна кількість можливих комбінацій бітів. Кожне додатне число може бути сполучене з його мінусом, але є лише один нуль. Якщо заперечувати нуль, ви отримуєте нуль. Отже, є ще одна комбінація - число з 1 у бітовому знаку та 0 скрізь в іншому місці. Відповідне додатне число не підходило б до кількості використовуваних бітів.

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

Це як вершина айсберга дивацтв. Під поверхнею чекає більше, але цього достатньо для цієї дискусії. Можливо, ви могли б знайти більше, якщо дослідите «переповнення» для арифметики з фіксованою точкою. Якщо ви дійсно хочете потрапити в нього, ви також можете дослідити "модульну арифметику".


1
Мені подобається ця відповідь! Пояснює, як прийняття 2s доповнення та додавання одного твору.
SJ.

Мені подобається і ця відповідь. Особливо там, де ви показуєте, як фігурує від’ємне число. Тут я подумав, що ціле число перевернуто, а не тільки MSB, а потім додало інші зважені значення. Дякую, це вирішило мій блок мозку
користувач188757

Хороша робота, згадуючи непарний номер, який не має зворотного. Але що ми з цим робимо? Чи просто ми встановлюємо прапор переповнення, якщо хтось намагається його перевернути?
NH.

Хоча інші відповіді зосереджуються на "як", ця відповідь обережно веде нас із "чому". Це мені допомогло. Дякую!
Абхішек Патхак

Якщо число закінчується на 11000 ... 000, перетворюючи його, вийде 01000 ... 000. Позначення доповнення двох засноване на ідеї, що всі цифри зліва від лівої лівої представленої цифри повинні мати те саме значення, що і ця цифра, але при переверненні числа, представлення якого 1000 ... 000, це не буде правдою.
Supercat

20

Доповнення 2 є дуже корисним для пошуку значення двійкового файлу, проте я подумав про набагато більш стислий спосіб вирішення такої проблеми (ніколи не бачив, щоб хтось її опублікував):

візьмемо, наприклад, двійкове: 1101, що є [припущенні, що пробіл "1" є знаком] рівним -3 .

використовуючи доповнення 2, ми зробимо це ... переверніть 1101 до 0010 ... додайте 0001 + 0010 ===> дає нам 0011. 0011 у позитивному двійковому значенні = 3. тому 1101 = -3 !

Що я зрозумів:

замість усіх гортання та додавання, ви можете просто виконати основний метод вирішення для позитивного двійкового (скажімо, 0101) є (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Зробіть точно таку ж концепцію з негативом! (З невеликим поворотом)

візьміть 1101, наприклад:

для першого числа замість 2 3 * 1 = 8 , зробіть - (2 3 * 1) = -8 .

потім продовжуйте, як зазвичай, роблячи -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3


1
Найкращий спосіб, я міг зрозуміти доповнення 2. Прочитавши це, я міг зрозуміти всі відповіді на вищезазначене питання.
Shakeel Shahzad

1
Цей метод згадується в книзі "Комп'ютерні системи: перспектива програміста".
Джимо

1
Це набагато швидший спосіб!
chanzerre

14

Уявіть, що у вас є обмежена кількість біт / тритів / цифр / що завгодно. Ви визначаєте 0 як усі цифри, що дорівнюють 0, і рахуєте вгору природно:

00
01
02
..

Зрештою ви переповниться.

98
99
00

Ми маємо дві цифри і можуть представляти всі числа від 0 до 100. Усі ці числа є позитивними! Припустимо, ми також хочемо представляти від’ємні числа?

У нас насправді є цикл. Число перед 2 дорівнює 1. Число перед 1 дорівнює 0. Число перед 0 дорівнює 99 .

Отже, для простоти скажімо, що будь-яке число старше 50 є від’ємним. "0" - "49" представляють від 0 до 49. "99" - -1, "98" - -2, ... "50" - -50.

Це представництво є доповнює десять . Комп'ютери, як правило, використовують доповнення двох , те саме, за винятком використання бітів замість цифр.

Приємна річ про доповнення десяти - це те, що додаток просто працює . Не потрібно робити нічого особливого, щоб додавати додатні та від’ємні числа!


9

Я прочитав фантастичне пояснення на Reddit від jng, використовуючи одометр як аналогію.

введіть тут опис зображення

Це корисна умова. Ті ж схеми та логічні операції, які додають / віднімають додаткові числа у двійковій формі, як і раніше, працюють як на позитивних, так і на від’ємних числах, якщо використовувати конвенцію, тому це так корисно і всюди.

Уявіть, що одометр автомобіля він котиться за (скажімо) 99999. Якщо ви зросте 00000, ви отримаєте 00001. Якщо ви зменшите 00000, ви отримаєте 99999 (за рахунок обертання). Якщо додати ще один номер до 99999, він повернеться до 00000. Тож корисно вирішити, що 99999 означає -1. Так само, дуже корисно вирішити, що 99998 являє собою -2 тощо. Ви повинні десь зупинитися, а також за домовленістю, верхня половина цифр вважається негативною (50000-99999), а нижня половина позитивною просто стоїть на собі (00000-49999). Як результат, найвища цифра 5-9 означає, що представлене число є негативним, а воно 0-4 означає, що представлене є позитивним - точно так само, як і верхній біт, що представляє знак у двійковому номері доповнення двох.

Зрозуміти це було і для мене важко. Як тільки я це зрозумів і повернувся до перечитування статей із книг та пояснень (тоді ще не було Інтернету), виявилося, що багато тих, хто описує, це не дуже зрозуміли. Після цього я написав книгу, що навчав асемблерній мові (яку продавали досить непогано протягом 10 років).


5

Двоє доповнення з’ясовується додаванням одного до першого доповнення даного числа. Скажімо, ми повинні з'ясувати доповнення двох, 10101а потім знайти його доповнення, тобто 01010додати 1до цього результату, тобто 01010+1=01011, що є остаточною відповіддю.


4

Давайте отримаємо відповідь 10 - 12 у двійковій формі за допомогою 8 біт: Що ми дійсно будемо робити, це 10 + (-12)

Нам потрібно отримати компліментну частину 12, щоб відняти її від 10. 12 у двійковій - 00001100. 10 у двійковій - 00001010.

Щоб отримати компліментну частину 12, ми просто перевернемо всі біти, а потім додаємо 1. 12 у двійковому зворотному рівні 11110011. Це також інверсний код (доповнення). Тепер нам потрібно додати один, який зараз є 11110100.

Тож 11110100 - комплімент 12! Легко, коли ви думаєте про це таким чином.

Тепер ви можете вирішити вищезазначене питання 10 - 12 у двійковій формі.

00001010
11110100
-----------------
11111110  

3

Доповнення 2: Коли ми додамо додатковий з доповненнями 1 числа, отримаємо доповнення 2. Наприклад: 100101 це доповнення 1 - 011010, а доповнення 2 - 011010 + 1 = 011011 (Додавши одне з доповненням 1) Для отримання додаткової інформації у цій статті поясніть це графічно.


плюс1 за посиланням, що має пояснення з колом
Манохар Редді Поредді

3

Дивитись на систему доповнення двох з математичної точки зору, це дійсно має сенс. У доповнення десяти, ідея полягає в тому, щоб по суті "ізолювати" різницю.

Приклад: 63 - 24 = x

Додамо доповнення 24, яке дійсно справедливо (100 - 24). Так що насправді, все, що ми робимо, - додавати 100 по обидва боки рівняння.

Тепер рівняння таке: 100 + 63 - 24 = x + 100, тому ми видаляємо 100 (або 10, або 1000 чи що завгодно).

Через незручну ситуацію, коли потрібно відняти одне число з довгого ланцюга нулів, ми використовуємо систему "зменшеного доповнення з радіацією", у десятковій системі - доповнення дев'яти.

Коли нам представлено число, відняте з великого ланцюжка дев’яти, нам просто потрібно змінити числа.

Приклад: 99999 - 03275 = 96724

Ось чому, після доповнення дев'яти, ми додаємо 1. Як ви, мабуть, знаєте з математики дитинства, 9 стає 10 шляхом "крадіжки" 1. Отже, в основному, це лише доповнення десяти, яке займає 1 від різниці.

У двійковій формі доповнення двох можна прирівнювати до доповнення десяти, тоді як доповнення двох - доповненням дев'яти. Основна відмінність полягає в тому, що замість того, щоб намагатися виділити різницю з потужностями десяти (додавання в рівняння 10, 100 і т.д.), ми намагаємось виділити різницю з двома потужностями.

Саме з цієї причини ми обертаємо біти. Так само, як мінуденд - це ланцюг дев'яток у десятковій формі, так і мінодент - це ланцюжок одиниць у двійкових.

Приклад: 111111 - 101001 = 010110

Оскільки ланцюги з них на 1 нижче, ніж потужність у два, вони "крадуть" 1 від різниці, як дев'ять у десяткових.

Коли ми використовуємо від’ємні двійкові числа, ми насправді просто кажемо:

0000 - 0101 = х

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Для того, щоб "виділити" х, нам потрібно додати 1, оскільки 1111 знаходиться на відстані від 10000, і ми видаляємо провідну 1, тому що ми просто додали її до початкової різниці.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

Просто видаліть 10000 з обох сторін, щоб отримати х, це основна алгебра.


3

Багато відповідей поки що добре пояснюють, чому доповнення двох використовується для позначення від'ємного числа, але не кажіть нам, що таке номер доповнення двох, особливо не тому, що додається "1", а насправді часто додається неправильно.

Плутанина походить від поганого розуміння визначення числа доповнення. Доповненням є відсутність частини, яка б зробила щось повне.

Доповненням радіусу n-значного числа x у радіусі b є, за визначенням, b ^ nx. У двійковій 4 представлено 100, що має 3 цифри (n = 3) і радіус 2 (b = 2). Значить, його радікс-доповнення дорівнює b ^ nx = 2 ^ 3-4 = 8-4 = 4 (або 100 у двійковій).

Однак у двійковому одержанні комплексу радіасу не так просто, як отримати його зменшене доповнення радіусу, яке визначається як (b ^ n-1) -y, лише на 1 менше, ніж у комплексу радіасу. Щоб отримати зменшене доповнення радіалу, ви просто перегорнете всі цифри.

100 -> 011 (зменшений (чийсь) радикальний доповнення)

щоб отримати доповнення до радикса (двох), ми просто додаємо 1, як визначено визначення.

011 +1 -> 100 (два доповнення).

Тепер з цим новим розумінням давайте подивимось на приклад, який дав Вінсент Рамдані (див. Вище другу відповідь)

/ * початок Вінсента

Перетворення 1111 в десятковий:

Число починається з 1, тому воно від'ємне, тому ми знаходимо доповнення 1111, що є 0000. Додаємо 1 до 0000, і отримуємо 0001. Перетворимо 0001 в десятковий, який дорівнює 1. Застосовуємо знак = -1. Тада!

кінець Вінсента * /

Слід розуміти як

Число починається з 1, тому воно від’ємне. Отже, ми знаємо, що це доповнення двох з деякої величини x. Щоб знайти х, представлене двома доповненнями, спочатку потрібно знайти його 1 доповнення.

два доповнення х: 1111, доповнення х: 1111-1 -> 1110; x = 0001, (перегорніть усі цифри)

застосувати знак -, а відповідь = -x = -1.


3

Слово доповнення походить від повноти. У десятковому світі цифри 0 - 9 забезпечують доповнення (повний набір) цифр або числових символів для вираження всіх десяткових чисел. У двійковому світі цифри 0 і 1 забезпечують a доповнення чисел для вираження всіх двійкових чисел. Насправді символи 0 і 1 повинні використовуватися для відображення всього (тексту, зображень тощо), а також позитивного (0) та негативного (1). У нашому світі порожній пробіл зліва від числа вважається нулем:

                  35=035=000000035.

У місці зберігання комп'ютера немає порожнього місця. Усі біти (двійкові цифри) повинні бути або 0, або 1. Для ефективного використання пам'яті номери можуть зберігатися у вигляді 8-бітного, 16-бітного, 32-бітного, 64-бітного, 128-бітного уявлень. Коли число, яке зберігається як 8-бітове число, переноситься в 16-бітове місце, знак і величина (абсолютне значення) повинні залишатися однаковими. Це доповнює як доповнення 1, так і 2 доповнення. Як іменник: як доповнення 1, так і доповнення 2 - це двійкові представлення підписаних величин, де найбільш значущим бітом (тим, що зліва) є бітовий знак. 0 - позитивний, а 1 - негативний. 2s доповнення не означає негативний. Це означає підписану кількість. Як і в десятковій частині, величина представлена ​​як додатна величина. Структура використовує розширення знаків для збереження кількості при просуванні до реєстру [] з більшою кількістю бітів:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Як дієслово: доповнення 2 означає заперечувати . Це не означає робити негатив. Це означає, якщо негатив роблять позитивним; якщо позитивний зробить негативним. Величина - це абсолютна величина:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Ця здатність дозволяє ефективно двійкове віднімання, використовуючи заперечення та додавання. a - b = a + (-b)

Офіційний спосіб прийняти доповнення 1 - для кожної цифри відняти його значення від 1.

        1'scomp(0101) = 1010.

Це те саме, що гортати або перевертати кожен біт окремо. Це призводить до негативного нуля, який не дуже люблять, тому додавання одного до доповнення te 1 позбавляється від проблеми. Щоб відмовити або взяти доповнення 2s, спочатку візьміть додаток 1s, а потім додайте 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

У прикладах заперечення працює також із розширеними числами знаків.

Додавання:
1110 Перевезти 111110 Перевезти 0110 - це те саме, що 000110 1111 111111 сума 0101 сума 000101

Витягування:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Зауважте, що при роботі з доповненням 2 порожній пробіл зліва від числа заповнюється нулями для додатних чисел, але заповнюється одиницями для від'ємних чисел. Перенесення завжди додається і має бути або 1, або 0.

Ура


3

Доповнення 2 - це по суті спосіб придумувати добавку, обернену двійковим числом. Задайте собі запитання: з огляду на число у двійковій формі, який бітовий зразок при додаванні до вихідного числа зробив би результат нульовим? Якщо ви можете придумати цей бітовий шаблон, то цей бітовий шаблон - це представлення -ve (додаткове обертання) вихідного числа; як за визначенням додавання числа до його додаткової оберненої повинно завжди призводити до нуля. Приклад: візьміть 101, що є десятковою 5. Тепер завдання - створити бітовий візерунок, який при додаванні до заданого бітового шаблону (101) призведе до нуля. Для цього почніть з самого правого біта 101 і для кожного окремого біта знову задайте те саме питання: Який біт слід додати до цього "біта", щоб результат став нульовим? продовжуйте робити це, враховуючи звичайне перенесення. Після того, як ми виконаємо з 3-х правильних більшості місць (цифр, які визначають вихідне число без урахування провідних нулів), остання переноска йде в бітовій схемі додаткової оберненої. Крім того, оскільки ми можемо містити в оригінальному числі, скажімо, один байт, всі інші провідні біти в додатковій оберненій частині також повинні бути 1, так що, коли комп'ютер додає число та його добавку, обернено, використовуючи тип "той" тип пам'яті (char) в результаті цього знака були б усі нулі.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

2

Мені сподобалась відповідь лавініо, але зміщення бітів додає певної складності. Часто є вибір рухомих бітів, дотримуючись біт знака або не поважаючи біт знака. Це вибір між трактуванням чисел як підписаними (-8 до 7 для nibble, -128 до 127 за байтами), так і цілими безпідписаними числами (0 до 15 для nibbles, 0 до 255 для байтів).


2

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

Отже, у додатку 2, якщо один дорівнює 0x0001, тоді -1 дорівнює 0x1111, оскільки це призведе до комбінованої суми 0x0000 (із переливом 1).


1

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

  1. Щоб уникнути численних уявлень 0
  2. Щоб уникнути відстеження долота для перенесення (як у доповненні) у разі переливу.
  3. Проведення простих операцій, таких як додавання і віднімання, стає простим.

Якщо ви хочете більш детального пояснення цього питання, спробуйте статтю, написану мною тут . Сподіваюся, це допомагає!


1

Доповнення двох є одним із способів вираження від’ємного числа, і більшість контролерів та процесорів зберігають від’ємне число у формі доповнення 2


1
Це не додає нічого до інформації, наданої іншими відповідями.
Адріан Моль

0

ДОВІДКА: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Я перевертаю всі біти і додаю 1. Програмно:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

Навіть асемблер був би надто високим. Потрібно побачити схему рівня логіки додавання логіки. З T циклами. Ви алгоритмічно правильні.
mckenzm

0

2 доповненням даного числа є ні. отримано, додавши 1 із доповненням 1 відсутній. припустимо, у нас є двійковий номер: 10111001101 Доповнення 1 це: 01000110010 І доповненням 2 буде: 01000110011


0

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

Використовуючи представлення комплементу 2 для підписаних цілих чисел, ми застосовуємо операцію доповнення 2 для перетворення додатного числа в його негативний еквівалент і навпаки. Отже, використовуючи приклад, наприклад, 0001(1) стає 1111(-1) і знову застосовувати оп, повертається до 0001.

Поведінка операції при нулі є вигідною у наданні єдиного представлення для нуля без спеціального оброблення позитивних та негативних нулів. 0000доповнює до 1111, що коли додається 1. переповнює 0000, даючи нам один нуль, а не позитивний та негативний.

Основна перевага цього подання полягає в тому, що стандартні схеми додавання для непідписаних цілих чисел дають правильні результати при застосуванні до них. Наприклад, додавши 1 і -1 у nibbles:, 0001 + 1111біти витікають з реєстру, залишаючи позаду 0000.

Для легкого вступу чудовий Computerphile підготував відео на цю тему .


0

Простіше 2's Complementкажучи - це спосіб збереження від’ємного числа в пам'яті комп’ютера. Тоді як позитивні номери зберігаються як нормальне двійкове число.

Розглянемо цей приклад,

Комп'ютер використовує Binary Number Systemдля представлення будь-якого числа.

x = 5;

Це представлено як 0101.

x = -5;

Коли комп'ютер -підписує підписи, він обчислює доповнення 2 та зберігає його. i.e5 = 0101, і це доповнення 2 1011.

Важливими правилами, які комп'ютер використовує для обробки чисел, є:

  1. Якщо перший біт, 1то він повинен бути negativeчислом.
  2. Якщо всі біти, окрім першого біта, 0- це додатне число, оскільки його немає -0в системі числення ( 1000 is not -0замість цього він є позитивним 8)
  3. Якщо всі біти - 0це так 0.
  4. Інакше це positive number.


-6

Найпростіша відповідь:

1111 + 1 = (1) 0000. Отже 1111 повинно бути -1. Тоді -1 + 1 = 0.

Це ідеально зрозуміти все це для мене.


Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх дописом.
Кодор

Це відповідь. Найпростіший. Для мене - найкращий.
Дмитро
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.