Алгоритм отримання додаткового коду негативного числа

Подання цілих чисел в комп'ютері.

Цілі числа є простими числовими даними, з якими оперує ЕОМ. Для цілих чисел існують два подання: беззнаковое (тільки для невід'ємних цілих чисел) і зі знаком. Очевидно, що негативні числа можна представляти тільки в знаковому вигляді. Цілі числа в комп'ютері зберігаються в форматі з фіксованою комою.

Подання цілих чисел в беззнакових цілих типах.


Для беззнакового уявлення все розряди осередки відводяться під уявлення самого числа. Наприклад, в байті (8 біт) можна уявити беззнакові числа від 0 до 255. Тому, якщо відомо, що числова величина є невід'ємне, то вигідніше розглядати її як беззнакову.

Подання цілих чисел в знакових цілих типах.


Для уявлення зі знаком найстарший (лівий) біт відводиться під знак числа, інші розряди - під саме число. Якщо число позитивне, то в знаковий розряд поміщається 0, якщо негативне - 1. Наприклад, в байті можна уявити знакові числа від -128 до 127.


Подання числа в звичній формі "знак" - "величина", при якій старший розряд осередку відводиться під знак, а решта - під запис числа в двійковій системі, називається прямим кодом двійкового числа. Наприклад, прямий код двійкових чисел 1001 і -1001 для 8-розрядної комірки дорівнює 00001001 та 10001001 відповідно.
Позитивні числа в ЕОМ завжди представляються за допомогою прямого коду. Прямий код числа повністю збігається із записом самого числа в комірці машини. Прямий код негативного числа відрізняється від прямого коду відповідного позитивного числа лише вмістом знакового розряду. Але негативні цілі числа не подаються у ЕОМ за допомогою прямого коду, для їх подання використовується так званий додатковий код.

Додатковий код числа.


Додатковий код позитивного числа дорівнює прямому коду цього числа. Додатковий код негативного числа m дорівнює 2 k - | m |, де k - кількість розрядів в осередку.
Як вже було сказано, при поданні невід'ємних чисел в беззнакову форматі все розряди осередки відводяться під саме число. Наприклад, запис числа 243 = 11110011 в одному байті при беззнакову поданні буде виглядати наступним чином:

знаковий розряд
Виникає питання: з якою метою негативні числа записуються у вигляді додаткового коду і як отримати додатковий код негативного числа?
Додатковий код використовується для спрощення виконання арифметичних операцій. Якби обчислювальна машина працювала з прямими кодами позитивних і негативних чисел, то при виконанні арифметичних операцій слід було б виконувати ряд додаткових дій. Наприклад, при складанні потрібно було б перевіряти знаки обох операндів і визначати знак результату. Якщо знаки однакові, то обчислюється сума операндів і їй присвоюється той же знак. Якщо знаки різні, то з більшого по абсолютній величині числа віднімається менша і результату присвоюється знак більшого числа. Тобто при такому поданні чисел (у вигляді тільки прямого коду) операція складання реалізується через досить складний алгоритм. Якщо ж негативні числа представляти у вигляді додаткового коду, то операція додавання, в тому числі і різного знака, зводиться до з порозрядного додавання.

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

Алгоритм отримання додаткового коду негативного числа.


Для отримання додаткової k-розрядного коду негативного числа необхідно

1. модуль негативного числа уявити прямим кодом в k довічних розрядах;

2. значення всіх біт инвертировать: всі нулі замінити на одиниці, а одиниці на нулі (таким чином, виходить k-розрядний зворотний код вихідного числа);

3. до отриманого зворотного коду додати одиницю.

приклад:
Отримаємо 8-розрядний додатковий код числа -52:

00110100 - число | -52 | = 52 в прямому коді

11001011 - число -52 в зворотному коді

11001100 - число -52 в додатковому коді


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