Якщо тип даних визначений як підписаний тип, існують різні типи представлення - головним чином представлення підписаної величини та представлення двох доповнень.
Для представленого представлення величини, так, біт знаків зберігався як найзначніший біт (MSB, тобто крайній лівий біт). MSB з 0 представляють позитивну цифру, а 1 - негативну. Приклад:
7 = 00000111
-7 = 10000111
Це просте і (відносно) для людини зрозуміле, проте цілі типи зазвичай не зберігаються таким чином для двох проблем:
(1) Існує два подання для нуля, +0 і -0. Потрібно порівнювати фігури, оскільки це створює особливий випадок.
(2) Обчислити непросто (так просто, як додавання і віднімання). Додавання двох позитивних чисел, додатного числа до від’ємного числа, від’ємного числа до додатного числа та додавання двох від’ємних чисел - це чотири різних випадки використання. наприклад, 7 + 6 прямо вперед
1 Carry bit
7 = 00000111
6 = 00000110 (Logic for add)
.. ........
13 = 00001101
Під час обчислення 7 + (- 6) означає логіку віднімання, яку слід використовувати замість цього
7 = 00000111
-6 = 10000110 (Logic for subtraction)
.. ........
1 = 00000001
Діапазон для 8-бітного числа є - (2 ^ 7) +1 до 2 ^ 7-1 (тобто від -127 до +127, з двома нулями +0 і -0). Підписане зображення величини в основному використовується для збереження плаваючих чисел.
І це призводить до представництва комплементу обох. Позитивні числа представлені так само, як і підписані величини. Зміна біта знаків займає два кроки: (1) Інвертувати всі біти (змінити всі 0 на 1 та 1 на 0) (2) Додати один.
Наприклад, для представлення -6 ми робимо наступні кроки
6 = 00000110
Invert all bits: 11111001
Add one: 11111010
Отже -6 представлений як 11111010
. З двома представниками доповнення, ви все ще можете прочитати знак із MSB; в той час як існує тільки одне подання для нуля: 00000000
.
Виконання обчислень з двійковими числами також легко представити в представленні комплементу двох - додавання додає. Давайте ще раз побачимо, як це працює для обчислення 7 + (- 6):
1111111 Carry bit
7 = 00000111
-6 = 11111010 (Logic for add)
.. ........
1 = 00000001
Діапазон для 8-бітного числа - от (2 ^ 7) до 2 ^ 7-1 (тобто від -128 до +127). Зауважте, що діапазон відрізняється від підписаного масштабного подання.
int
(у С) може бути будь-якої ширини 16 біт або більше. Що стосується знаку, то Google "додає двох".