Вы запутались, потому что забыли, что должно быть что-то, что отличает положительные числа от отрицательных.
Допустим, вы хотите хранить неотрицательные числа в 8 битах.
00000000
равно 0,
00000001
равно 1,
00000010
- это 2,
00000011
- это 3,
00000100
- это 4,
- ...
11111111
- это 255
Таким образом, вы можете хранить числа в диапазоне 0-255 на 8 бит. 255 = 28 - 1. (2 - основа двоичной системы, 8 - количество бит, 1 вычтено, потому что мы хотим считать 0 в)
Теперь предположим, что вы хотите хранить и отрицательные числа. Как мы можем этого достичь? Мы можем посвятить один бит для знака. Если этот бит равен 0
мы интерпретируем остальные 7 бит как положительное число, в противном случае как отрицательное число. Лучше всего использовать самый значимый бит для знака, потому что это облегчает некоторые операции.
Тривиальный подход: просто прочитайте число как есть:
00000001
== 1 и 10000001
== -1
01000010
== 66 и 11000010
== -66
01111111
== 127 и 11111111
== -127
Дополнение единиц: для любого числа x
отрицание его двоичного представления дает двоичное представление -x
. Это означает, что:
00000001
== 1 и 11111110
== -1
01000010
== 66 и 10111101
== -66
01111111
== 127 и 10000000
== -127
Дополнение к двум: для любого числа x
отрицание его двоичного представления и добавление 1 дает двоичное представление -x
. Это означает, что:
00000001
== 1 и 11111111
== -1
01000010
== 66 и 10111110
== -66
01111111
== 127 и 1000001
== -127
10000000
== -128
Почему два дополнения лучше?
- Потому что у него самый широкий диапазон: -128 ... 127, а при тривиальном подходе и дополнении - -127 ... 127
- Ноль хорошо определен:
- В двух дополнениях только
00000000
- ноль
- При тривиальном подходе и
00000000
и 10000000
равны нулю
- В одном дополнении оба
00000000
и 11111111
равны нулю
- Сложение и вычитание такие же, как и для чисел без знака, поэтому ЦП не нужны дополнительные инструкции для добавления чисел со знаком.
Обратите внимание, что если мы выделим самый значимый бит для знакового бита, то мы не сможем преобразовать число в двоичное, не зная, сколько бит нам понадобится. Например, у нас есть 4 бита, тогда число -5 в тривиальном подходе равно 1101
, на 7 битах это будет 1000101
. 0001101
(4-битный -5, дополненный нулями до 7-битной длины) на самом деле равен 13 (старший бит равен 0, поэтому он положительный).
Я не буду делать домашнее задание для вас, но я могу дать вам общие советы:
Чтобы преобразовать -x
в N
бит длиной, два представления дополнения:
- Конвертировать
-x
в двоичный файл, используя два дополнения.
- Левый блок дополняется нулями до
N-1
длины.
- Добавьте бит отрицательного знака на левой стороне.
Я думаю, что вы можете понять остальное из этого ответа. Если у вас есть еще вопросы, оставьте комментарий.