Є три різні способи представлення цілого числа (артикула) зі знаком. a: біт зі знаком, b: доповнення 1 і c: доповнення 2. Давайте спробуємо зрозуміти, як виникли ці методи та чому доповненню 2 віддають перевагу над іншими.
Як відомо, дані зберігаються в бітах. Як ми можемо зберегти ціле число зі знаком у пам’яті? Щоб вирішити цю проблему, спочатку ми розробимо наївне рішення, а потім будемо повторювати його, поки не знайдемо найкраще рішення для нашої проблеми.
а) Біт зі знаком
Під час спроби зберегти ціле число зі знаком здається очевидним зарезервувати крайній лівий біт для знака та використати решту бітів для фактичного збереження значень. Наприклад: у 4-розрядній системі перший біт зліва буде зарезервовано для знака (0 означає додатне значення, тоді як 1 означає від’ємне), а інші 3 біти будуть використовуватися для зберігання значень. Подібним чином у 8-бітній системі перший біт зліва буде використовуватися для знака, а решта 7 – для значень.
| пан ні | Двійкове представлення | Десяткове значення |
| А | 0000 | +0 |
| Б | 0001 | +1 |
| C | 0010 | +2 |
| Д | 0011 | +3 |
| І | 0100 | +4 |
| Ф | 0101 | +5 |
| Г | 0110 | +6 |
| Х | 0111 | +7 |
| я | 1000 | -0 |
| Дж | 1001 | -1 |
| К | 1010 | -2 |
| Л | 1011 | -3 |
| М | 1100 | -4 |
| Н | 1101 | -5 |
| О | 1110 | -6 |
| П | 1111 | -7 |
Використовуючи цей підхід, ми успішно можемо представити ціле число зі знаком. Але якщо ми детальніше проаналізуємо це, то побачимо наступні недоліки:
1) Два представлення нуля:
У 4-розрядній системі ми повинні мати можливість зберігати 16 (24) значень, але від +1 до +7 і від -1 до -7 лише 14 значень. Де залишилися два значення? Уважно спостерігаючи за таблицею, ми побачимо, що ці два значення сходяться до 0. Таким чином, ми маємо два представлення нуля, тобто одне представлення для +0, а інше для -0.
Але чи є два представлення 0 великою проблемою? І що? Замість 16 унікальних значень ми можемо зберігати лише 15 значень. Ми можемо дозволити собі зменшити діапазон на 1, чи не так? Для розробника програмного забезпечення це може не стосуватися, але для розробника схем може бути дуже неприємно спочатку перевірити, чи значення дорівнює +0, а потім перевірити, чи воно -0.
2) Підписане розширення не працює для від’ємних чисел:
Розмір даних швидко зростає. Деякий час нам потрібно розширити бітову систему, щоб ми могли збільшити діапазон даних, які можна зберігати. У 2014 році відео Gangnam Style перевищило ліміт переглядів на YouTube, і це змусило YouTube оновити кількість переглядів із 32-бітного до 64-бітового цілого числа зі знаком. Подібним чином 32-розрядний годинник Unix переповниться 19 січня 2038 року, оскільки він записує час у секундах у 32-розрядне ціле число зі знаком.
Отже, не менш важливо, щоб наша система представлення була легко розширюваною, що неможливо з цією системою представлення.
| Десятковий | 4-бітний | 5-бітний | 6-бітний |
| +2 | 0010 | 00010 | 000010 |
| +7 | 0111 | 00111 | 000111 |
| -2 | 1010 | 10010 (!= 11010) | 100010 (!= 111010) |
| -7 | 1111 | 10111 (!= 11111) | 100111 (!= 111111) |
3) Двійкове додавання не працює:
Спробуємо скласти два двійкові числа:
| Двійковий | Десятковий | Двійковий | Десятковий | Двійковий | Десятковий | |||
| Номер 1 | 0010 | +2 | 0111 | +7 | 1101 | -5 | ||
| Номер-2 | 1010 | -2 | 1010 | -2 | 0011 | +3 | ||
| Двійкове додавання | 1100 | -4 | 0001 | +1 | 0000 | +0 | ||
| Десяткове додавання | +0 | +5 | -2 |
Чому тут не працює просте двійкове додавання? Причина в тому, що знаковий біт (крайній зліва) не є звичайним бітом і не є частиною фактичного числа. Уявіть собі ситуацію, коли потрібно розробити апаратну схему, щоб ігнорувати знаковий біт для виконання додавання, а потім додавати знаковий біт.
Отже, це був наївний спосіб представити ціле число зі знаком. Основна проблема цього підходу полягає в тому, що ми відобразили від’ємні числа вниз. Якщо ми змінимо нашу систему відображення, щоб перейти до них, деякі вищезазначені проблеми будуть вирішені.
б) 1's Co реалізувати
Якщо ми переставимо наші від’ємні числа зверху вниз, то ми отримаємо наступну двійкову таблицю:
| Так ні. | Двійкове представлення | Десяткове значення | |
| 1 доповнення | Біт зі знаком | ||
| А | 0000 | +0 | +0 |
| Б | 0001 | +1 | +1 |
| C | 0010 | +2римські цифри 1100 | +2 |
| Д | 0011 | +3 | +3 |
| І | 0100 | +4 | +4 |
| Ф | 0101 | +5 | +5 |
| Г | 0110 | +6 | +6 |
| Х | 0111 | +7 | +7 |
| я | 1000 | -7 | -0 |
| Дж | 1001 | -6 | -1 |
| К | 1010 | -5 | -2 |
| Л | 1011 | -4 | -3 |
| М | 1100 | -3 | -4 |
| Н | 1101 | -2 | -5 |
| О | 1110 | -1 | -6 |
| П | 1111 | -0 | -7 |
Як отримати двійкове представлення цілого числа в методі доповнення 1?
- Додатні числа представлені подібно до цілого числа зі знаком
- Від’ємні числа представлені шляхом інвертування кожного біта відповідного додатного числа (інвертування можна легко виконати, використовуючи гейт NOT під час проектування обладнання)
Давайте уважно проаналізуємо це, щоб побачити, чи досягли ми якогось покращення.
1) Два представлення нуля:
У цьому підході ми також маємо два представлення нуля.
2) Підписане розширення не працює для від’ємних чисел:
Підписане розширення ідеально працює для від’ємних чисел.
| Десятковий | 4-бітний | 5-бітний | 6-бітний |
| +2 | 0010 | 00010 | 000010 |
| +7 | 0111 | 00111 | 000111 |
| -2 | 1101 | 11101 | 111101 |
| -7 | 1000 | 11000 | 111000 |
3) Двійкове додавання працює за зміненими правилами:
| Двійковий | Десятковий | Двійковий | Десятковий | Двійковий | Десятковий | |||
| Номер 1 | 0010 | +2 | 0111 | +7 | 1010 | -5 | ||
| Номер-2 | 1101 | -2 | 1101 | -2 | 0011 | +3 | ||
| Двійкове додавання | 1111 | -0 | 0100 | +4 | 1101 | -2 | ||
| Десяткове додавання | +0 | +5 | -2 |
Відповідь не завжди правильна, але дуже близька до правильної. Ми можемо змусити це працювати, якщо дотримуватимемося правила якщо ви згенерували перенесення вперед на крайньому лівому біті, то не викидайте його, а поверніть його назад і додайте до крайнього правого біта.
| Двійковий | Десятковий | Двійковий | Десятковий | Двійковий | Десятковий | |||
| Номер 1 | 0111 | +7 | 1110 | -1 | 0111 | +7 | ||
| Номер-2 | 1101 | -2 | 1001 | -6 | 1011 | -4 | ||
| Двійкове додавання | (1) 0100 | +4 | (1) 0111 | +7 | (1) 0010 | +2 | ||
| Додавання переносу вперед назад | 0101 | +5 | 1000 | -7 | 0011 | +3 |
Однозначно метод доповнення 1 кращий, ніж біт зі знаком. Наші основні проблеми вирішено, але залишається проблема (наявність двох представлень нуля), а наш хак у двійковому додаванні дає підказки для вдосконалення методу доповнення до 1. Давайте перефразуємо ці речення, щоб було легше.
- У нас є додаткове представлення нуля, яке є непотрібним
- Під час додавання двох двійкових чисел, якщо ми маємо перенесення в крайній лівий біт, тоді ми повинні додати +1 до результату, тобто правильну відповідь можна знайти, перейшовши до наступного рядка двійкової таблиці.
Обидва вони вказують нам, що додаткове представлення нуля є основною причиною проблеми. Отже, давайте видалимо цей зайвий нуль і перемістимо всі від’ємні значення до наступного рядка (-7 переміститься з I -> J, -6 переміститься з J -> K і так далі…)
в) доповнення до 2
Коли ми видалимо -0 із таблиці доповнення до 1 і перенесемо всі від’ємні значення на один рядок нижче, то отримаємо наступну таблицю, яка називається доповненням до 2:
| Так ні. | Двійкове представлення | Десяткове значення | |||
| 2 доповнення | 1 доповнення | Біт зі знаком | |||
| А | 0000 | +0 | +0 | +0 | |
Бсписок релігій | 0001 | +1 | +1 | +1 | |
| C | 0010 | +2 | +2 | +2 | |
| Д | 0011 | +3 | +3 | +3 | |
| І | 0100 | +4 | +4 | +4 | |
| Ф | 0101 | +5 | +5 | +5 | |
| Г | 0110 | +6 | +6 | +6 | |
| Х | 0111 | +7 | +7 | +7 | |
| я | 1000 | -8 | -7 | -0 | |
| Дж | 1001 | -7 | = зворотне 7 + 1-біт | -6 | -1 |
| К | 1010 | -6 | = зворотне 6 + 1-біт | -5 | -2 |
| Л | 1011 | -5 | = зворотне 5 + 1-біт | -4 | -3 |
| М | 1100 | -4 | = зворотне 4 + 1-біт | -3 | -4 |
| Н | 1101 | -3 | = зворотне 3 + 1-біт | -2 | -5 |
| О | 1110 | -2 | = зворотне 2 + 1-біт | -1 | -6 |
| П | 1111 | -1 | = зворотне 1 + 1-біт | -0 | -7 |
Як отримати двійкове представлення цілого числа в методі доповнення 2?
- Додатні числа представлені подібно до цілого числа зі знаком
- Від’ємні числа представлені шляхом інвертування кожного біта відповідного позитивного числа та додавання до нього 1 біта
1) Одне представлення нуля:
Тепер у нас є лише одне представлення нуля, і це дозволяє нам зберігати всього 16 унікальних значень (від +0 до +7 і від -1 до -8).
2) Підписане розширення працює для від’ємних чисел:
Підписане розширення ідеально працює для від’ємних чисел.
| Десятковий | 4-бітний | 5-бітний | 6-бітний |
| +2 | 0010 | 00010 | 000010 |
| +7 | 0111 | 00111 | 000111 |
| -2 | 1110 | 11110 | 111110 |
| -7 | 1001 | 11001 | 111001 |
3) Двійкове додавання:
| Двійковий | Десятковий | Двійковий | Десятковий | Двійковий | Десятковий | Двійковий | Десятковий | ||||
| Номер 1 | 0010 | +2 | 0111 | +7 | 1011 | -5 | 1111 | -1 | |||
| Номер-2 | 1110 | -2 | 1110 | -2 | 0011 | +3 | 1010 | -6 | |||
| Відповідь | 0000 | +0 | 0101 | +5 | 1110 | -2 | 1001 | -7 |
4) Перший біт є бітом зі знаком:
Доповнення до 2 має таку гарну властивість, що перший біт є знаковим, тому що всі додатні значення починаються з 0, а всі негативні — з 1.
5) Перевірка переповнення пам'яті:
Виконуючи додавання, ми переконалися, що наша відповідь знаходиться в діапазоні, але під час проектування апаратного забезпечення необхідно виявити переповнення пам’яті. Для розробників апаратного забезпечення буде дуже поганою ідеєю перевіряти величину, щоб уловити переповнення. Метод доповнення 2 забезпечує дуже простий спосіб виявити переповнення пам’яті. я Якщо перенесення до біта зі знаком не дорівнює перенесенню біта зі знаком, то це випадок переповнення пам’яті тобто, якщо перенесення до біта зі знаком дорівнює 0, а виконання дорівнює 1 або якщо перенесення до 1, але виконання дорівнює 0, то це випадок переповнення пам’яті.
| Двійковий | Десятковий | Двійковий | Десятковий | Двійковий | Десятковий | Двійковий | Десятковий | ||||
| Номер 1 | 1011 | -5 | 0010 | 2 | 0111 | +7 | 1011 | -5 | |||
| Номер-2 | 1100 | -4 | 0110 | 6 | 1110 | -2 | 0011 | 3 | |||
| Доповнення | (1) 0111 | (0)1000 | (1)0101 | (0)1110 | |||||||
| внести біт знака | 0 | перелив | 1 | переливхто є urfi javed | 1 | Немає | 0 | Немає | |||
| виконати для підпису біт | 1 | 0 | 1 | 0 |