Как и большинство объяснений, которые я видел, приведенные выше ясно показывают, как работать с дополнением до 2, но на самом деле не объясняют, что они есть математически. Я постараюсь сделать это, по крайней мере, для целых чисел, и сначала расскажу о некоторой предыстории, которая, вероятно, знакома.
Вспомните, как это работает с десятичными числами:
2345
- это способ записи
2 10 3 + 3 10 2 + 4 10 1 + 5 10 0 .
Точно так же двоичный код - это способ записи чисел с использованием только 0 и 1, следуя той же общей идее, но заменяя эти 10 выше на 2. Затем в двоичном формате
1111
представляет собой способ записи
1 2 3 + 1 strong> 2 2 + 1 2 1 + 1 2 0
и если вы проработаете это, это окажется равным 15 (основание 10). Это потому, что это
8 + 4 + 2 + 1 = 15.
Это все хорошо для положительных чисел. Это работает даже для отрицательных чисел, если вы готовы просто поставить перед ними знак минус, как люди делают с десятичными числами. Это можно сделать даже в компьютерах, вроде того, но я не видел такого компьютера с начала 1970-х годов. Я оставлю причины для другого обсуждения.
Для компьютеров более эффективным оказывается использование представления с дополнением для отрицательных чисел. И вот кое-что, о чем часто забывают. Обозначения дополнения включают в себя некоторую инверсию цифр числа, даже подразумеваемых нулей, которые идут перед нормальным положительным числом. Это неудобно, потому что возникает вопрос: все? Это может быть бесконечное количество цифр.
К счастью, компьютеры не представляют собой бесконечности. Числа ограничены определенной длиной (или шириной, если хотите). Итак, вернемся к положительным двоичным числам, но с определенным размером. В этих примерах я буду использовать 8 цифр («бит»). Таким образом, наше двоичное число действительно будет
00001111
или
0 2 7 + 0 strong > 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 < sup> 7 + 1 2 6 + 1 2 5 + 1 strong> 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 везде. Соответствующее положительное число не поместится в число используемых битов.
Что еще более странно в этом числе, так это то, что если вы попытаетесь сформировать его положительное число путем дополнения и добавления единицы, вы получите то же отрицательное число обратно. Кажется естественным, что ноль сделает это, но это неожиданно и совсем не то поведение, к которому мы привыкли, потому что помимо компьютеров мы обычно думаем о неограниченном количестве цифр, а не об арифметике фиксированной длины.
Это похоже на верхушку айсберга странностей. Под поверхностью подстерегает еще больше, но этого достаточно для обсуждения. Вы, вероятно, сможете найти больше, если исследуете «переполнение» для арифметики с фиксированной точкой. Если вы действительно хотите вникнуть в это, вы можете также изучить «модульную арифметику».
person
Community
schedule
18.08.2012
0
, оно дает2^N
(по определению), например. с 3 битами для числаA
мы хотимA+~A=2^N
, поэтому010 + 110 = 1000 = 8
, что равно2^3
. По крайней мере, это проясняет, что должно означать здесь слово «дополнение», поскольку это не просто инверсия значений0
и1
. Полезное видео MIT: youtube.com/watch?v=RbJV-g9Lob8 - person Charlie Parker   schedule 15.09.2020