Як і більшість пояснень , які я бачив, вище них є чітким уявленням про те , як працювати з 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 скрізь в іншому місці. Відповідне додатне число не підходило б до кількості використовуваних бітів.
Що ще дивніше щодо цього числа - це те, що якщо ви спробуєте сформувати його позитив, доповнивши і додавши його, ви отримаєте те саме негативне число. Здається природним, що нуль зробив би це, але це несподівано, і зовсім не така поведінка, до якої ми звикли, оскільки комп'ютери осторонь, ми, як правило, думаємо про необмежену кількість цифр, а не про цю арифметику фіксованої довжини.
Це як вершина айсберга дивацтв. Під поверхнею чекає більше, але цього достатньо для цієї дискусії. Можливо, ви могли б знайти більше, якщо дослідите «переповнення» для арифметики з фіксованою точкою. Якщо ви дійсно хочете потрапити в нього, ви також можете дослідити "модульну арифметику".