Что такое "2 дополнения"?

Я учусь на курсах по компьютерным системам и частично борюсь с Two Complement. Я хочу это понять, но все, что я прочитал, не принесло мне картину. Я прочитал статью в Википедии и другие статьи, включая мой учебник.

Поэтому я хотел начать эту вики- публикацию сообщества, чтобы определить, что такое Two Complement, как его использовать и как он может влиять на числа во время таких операций, как приведение (от подписи к беззнаковому и наоборот), побитовых операций и операций сдвига битов.,

Я надеюсь на четкое и краткое определение, которое легко понять программисту.

Ответ 1

Два дополнения - это умный способ хранения целых чисел, поэтому общие математические задачи очень просты в реализации.

Чтобы понять, нужно думать о числах в двоичном виде.

Это в основном говорит,

  • для нуля используйте все 0.
  • для положительных целых чисел начните отсчет максимум с 2 (number of bits - 1) -1.
  • для отрицательных целых чисел сделайте то же самое, но поменяйте местами 0 и 1 (поэтому вместо того, чтобы начинать с 0000, начните с 1111 - это часть "дополнения").

Давайте попробуем это с мини-байтом в 4 бита (мы будем называть это полубайтом - 1/2 байта).

  • 0000 - ноль
  • 0001 - один
  • 0010 - два
  • 0011 - три
  • 0100 - 0111 - с четырех до семи

Это, насколько мы можем пойти в позитивах. 2 3 -1 = 7.

Для негативов:

  • 1111 - отрицательный
  • 1110 - два отрицательных
  • 1101 - отрицательная тройка
  • От 1100 до 1000 - от четырех до отрицательных восьми

Обратите внимание, что вы получаете одно дополнительное значение для негативов (1000 = -8), которое вы не получаете для позитивов. Это потому, что 0000 используется для нуля. Это можно рассматривать как номерную строку компьютеров.

Различение положительных и отрицательных чисел

При этом первый бит получает роль "знакового" бита, поскольку его можно использовать для различения положительных и отрицательных десятичных значений. Если старшим значащим битом является 1, то двоичный код можно назвать отрицательным, тогда как, если самый значимый бит (крайний левый) - это 0, можно сказать, что десятичное значение положительно.

"Один комплимент" отрицательных чисел просто переворачивает знаковый бит, а затем отсчитывает от 0. Но этот подход имеет дело с интерпретацией 1000 как "отрицательного нуля", что вводит в заблуждение. Обычно вам приходится беспокоиться об этом только при работе с оборудованием.

Ответ 2

Интересно, можно ли объяснить это лучше, чем статья в Википедии.

Основная проблема, которую вы пытаетесь решить с помощью двух дополнительных представлений, - проблема хранения отрицательных целых чисел.

Сначала рассмотрим целое число без знака, сохраненное в 4 битах. У вас может быть следующее

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Они неподписанны, потому что нет указания на то, являются ли они отрицательными или положительными.

Знак Величина и Превышение Нотации

Чтобы сохранить отрицательные числа, вы можете попробовать несколько вещей. Во-первых, вы можете использовать нотацию знака знака, которая назначает первый бит в качестве знакового бита для представления +/- и остальных бит для представления величины. Таким образом, используя 4 бит снова и предполагая, что 1 означает - и 0 означает +, то у вас есть

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Итак, вы видите проблему там? У нас положительный и отрицательный 0. Большая проблема заключается в добавлении и вычитании двоичных чисел. Схемы для добавления и вычитания с использованием знаковой величины будут очень сложными.

Что такое

0010
1001 +
----

?

Другая система - избыточная нотация. Вы можете хранить отрицательные числа, вы избавляетесь от двух проблем с нулями, но сложение и вычитание остаются трудными.

Итак, идет два дополнения. Теперь вы можете хранить положительные и отрицательные целые числа и выполнять арифметику с относительной легкостью. Существует несколько способов преобразования числа в два дополнения. Здесь один.

Преобразование десятичного кода в два дополнения

  • Преобразуйте число в двоичный (пока не игнорируйте знак) например 5 - 0101, а -5 - 0101

  • Если число положительное, значит, вы закончили. например 5 является 0101 в двоичном формате с использованием двухкомпонентной нотации.

  • Если число отрицательно, то

    3.1 найти дополнение (инвертировать 0 и 1)  например -5 равен 0101, поэтому найти дополнение 1010

    3.2 Добавить 1 в дополнение 1010 + 1 = 1011.    Следовательно, -5 в двух дополнениях - 1011.

Итак, что, если вы хотите сделать 2 + (-3) в двоичном формате? 2 + (-3) - -1. Что бы вы сделали, если бы вы использовали значение знака для добавления этих чисел? 0010 + 1101 =?

Используя два дополнения, подумайте, насколько это было бы легко.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Преобразование двух дополнений в десятичные

Преобразование 1111 в десятичное:

  • Число начинается с 1, поэтому оно отрицательно, поэтому мы находим дополнение 1111, которое равно 0000.

  • Добавьте 1 к 0000, и мы получим 0001.

  • Преобразование 0001 в десятичный, что равно 1.

  • Применить знак = -1.

Тада!

Ответ 3

Как и большинство объяснений, которые я видел, выше них является четким представлением о том, как работать с 2 дополнением, но на самом деле не объяснить, что они математически. Я постараюсь сделать это, по крайней мере, для целых чисел, и я расскажу о некоторых предпосылках, которые, вероятно, знакомы сначала.

Вспомните, как он работает для десятичного числа:
2345
является способом написания
2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0.

Таким же образом, двоичный код - это способ записи чисел, используя только 0 и 1, следуя одной и той же общей идее, но заменяя те 10s выше на 2s. Затем в двоичном выражении,
1111
является способом написания
1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
и если вы это сделаете, то получится равным 15 (база 10). Это потому, что
8 + 4 + 2 + 1 = 15.

Это хорошо и полезно для положительных чисел. Это даже работает для отрицательных чисел, если вы готовы просто придерживаться знака минус перед ними, как люди делают с десятичными числами. Это можно сделать даже на компьютерах, но я не видел таких компьютеров с начала 1970-х годов. Я оставлю причины для другого обсуждения.

Для компьютеров оказывается более эффективным использование представления дополнений для отрицательных чисел. И здесь что-то часто упускается из виду. Дополняющие обозначения включают в себя какой-то разворот цифр числа, даже подразумеваемых нулей, которые идут до нормального положительного числа. Это неудобно, потому что возникает вопрос: все они? Это может быть бесконечное количество цифр, которые нужно учитывать.

К счастью, компьютеры не представляют бесконечности. Числа ограничены определенной длиной (или шириной, если хотите). Поэтому вернемся к положительным двоичным числам, но с конкретным размером. Я буду использовать 8 цифр ("бит") для этих примеров. Таким образом, наш двоичный номер действительно будет
00001111
или
0 × 2 7 + 0 × 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 7 + 1 × 2 6 + 1 × 2 5 + 1 × 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 во всем остальном. Соответствующее положительное число не будет соответствовать количеству используемых битов.

Что еще более странно в этом номере, так это то, что если вы попытаетесь сформировать свой позитив, дополняя и добавляя его, вы получите тот же отрицательный номер обратно. Кажется естественным, что ноль будет делать это, но это неожиданно и вовсе не то поведение, к которому мы привыкли, поскольку компьютеры в стороне, мы обычно думаем о неограниченном количестве цифр, а не об арифметике с фиксированной длиной.

Это похоже на верхушку айсберга странностей. Там еще лежат под поверхностью под поверхностью, но этого достаточно для обсуждения. Вероятно, вы можете найти больше, если вы исследуете "переполнение" для арифметики с фиксированной точкой. Если вы действительно хотите войти в него, вы можете также изучить "модульную арифметику".

Ответ 4

2 дополнение очень полезно для определения значения двоичного файла, однако я подумал о гораздо более сжатом способе решения такой проблемы (никогда не видел, чтобы кто-либо публиковал его):

возьмите двоичный код, например: 1101, который [предполагается, что пробел "1" является знаком], равным -3.

используя 2 дополнения, мы сделали бы это... flip 1101 to 0010... add 0001 + 0010 === > дает нам 0011. 0011 в положительном двоичном = 3. поэтому 1101 = -3!

Что я понял:

вместо всего листания и добавления, вы можете просто сделать основной метод для решения для положительной бинарной (скажем, 0101): (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Сделайте точно ту же концепцию с отрицательным! (с небольшим завихрением)

возьмите 1101, например:

для первого числа вместо 2 3 * 1 = 8, do - (2 3 * 1) = - 8.

затем продолжаем, как обычно, выполнение -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3

Ответ 5

Представьте, что у вас есть конечное количество бит/трит/цифр/что угодно. Вы определяете 0, так как все цифры равны 0 и естественно подсчитываются вверх:

00
01
02
..

В конце концов вы переполнитесь.

98
99
00

У нас есть две цифры и может представлять все числа от 0 до 100. Все эти цифры положительны! Предположим, мы тоже хотим представить отрицательные числа?

У нас действительно есть цикл. Число до 2 равно 1. Число до 1 равно 0. Число до 0 равно... 99.

Итак, для простоты предположим, что любое число более 50 отрицательно. "0" - "49" - от 0 до 49. "99" равно -1, "98" равно -2,... "50" равно -50.

Это представление десять дополнений. Обычно компьютеры используют два дополнения, что является одним и тем же, за исключением использования битов вместо цифр.

Приятная вещь из десяти дополнений заключается в том, что добавление просто работает. Вам не нужно ничего делать, чтобы добавить положительные и отрицательные числа!

Ответ 6

Два дополнения обнаруживаются добавлением одного к 1-м дополнению к заданному числу. Допустим, нам нужно найти два дополнения 10101, затем найти его дополнение, то есть 01010 добавить 1 к этому результату, то есть 01010+1=01011, что является окончательным ответом.

Ответ 7

Я прочитал фантастическое объяснение на Reddit от jng, используя одометр в качестве аналогии.

enter image description here

Это полезное соглашение. Те же схемы и логические операции, которые сложение/вычитание положительных чисел в двоичном виде по-прежнему работают на обоих и отрицательные числа при использовании соглашения, вот почему это так полезный и вездесущий.

Представьте себе одометр автомобиля, он катится на (скажем) 99999. Если вы с шагом 00000 вы получите 00001. Если вы уменьшите 00000, вы получите 99999 (из-за откатывания). Если вы добавите один обратно в 99999, он возвращается к 00000. Поэтому полезно решить, что 99999 представляет -1. Точно так же очень полезно решить, что 99998 представляет -2 и так далее. У вас есть чтобы остановиться где-то, а также по договоренности, верхняя половина чисел считаются отрицательными (50000-99999), а нижняя половина - положительной просто постоять за себя (00000-49999). В результате верхняя цифра 5-9 означает, что представленное число отрицательно, а 0-4 означает, что представленное является положительным - точно так же, как верхний бит представляющий знак в двоичном числе из двух дополнений.

Понимать это было сложно и для меня. Однажды я получил его и вернулся к перечитайте книги, статьи и объяснения (не было интернета тогда) оказалось, что многие из тех, кто описывает это на самом деле не понимать это. Я написал книгу, преподающую ассемблер после это (которое продавалось довольно хорошо в течение 10 лет).

Ответ 8

Позволяет получить ответ 10-12 в двоичной форме с использованием 8 бит: Мы действительно сделаем это 10 + (-12)

Нам нужно получить часть комплимента из 12, чтобы вычесть его из 10. 12 в двоичном формате - 00001100. 10 в двоичном формате - 00001010.

Чтобы получить часть комплимента из 12, мы просто отменим все биты, а затем добавим 1. 12 в двоичном обратном - 11110011. Это также обратный код (одно дополнение). Теперь нам нужно добавить один, который теперь 11110100.

Итак, 11110100 - это комплимент 12! Легко, когда вы думаете об этом таким образом.

Теперь вы можете решить вышеупомянутый вопрос 10-12 в двоичной форме.

00001010
11110100
-----------------
11111110  

Ответ 9

Глядя на две системы дополнений с математической точки зрения, это действительно имеет смысл. В десяти дополнениях идея состоит в том, чтобы по существу "изолировать" разницу.

Пример: 63 - 24 = x

Добавим дополнение к 24, которое действительно справедливо (100 - 24). Итак, все, что мы делаем, это добавление 100 по обе стороны от уравнения.

Теперь уравнение равно 100 + 63 - 24 = x + 100, поэтому мы удаляем 100 (или 10 или 1000 или что-то еще).

Из-за неудобной ситуации, заключающейся в том, что нужно вычесть одно число из длинной цепочки нулей, мы используем систему с уменьшенным радиальным дополнением, в десятичной системе - девять дополнений.

Когда нам присваивается число, вычитаемое из большой цепочки из девяток, нам просто нужно отменить числа.

Пример: 99999 - 03275 = 96724

Вот почему, после девяти дополнений, мы добавляем 1. Как вы, вероятно, знаете из детской математики, 9 становится 10 путем "кражи" 1. Таким образом, в основном это всего лишь десять дополнений, которые берут 1 из разницы.

В двоичном выражении два дополнения эквивалентны десяти дополнению, а одно дополнение к девяти дополнению. Основное отличие состоит в том, что вместо того, чтобы пытаться изолировать разницу с степенями десяти (добавив 10, 100 и т.д. В уравнение), мы пытаемся изолировать разницу с степенями двух.

Именно по этой причине мы инвертируем биты. Точно так же, как наш minuend представляет собой цепочку из десятичных чисел в десятичной форме, наш minuend является цепочкой из двоичных.

Пример: 111111 - 101001 = 010110

Поскольку цепочки единиц равны 1 ниже приятной степени в два, они "крадут" 1 из разницы, как девять, в десятичной форме.

Когда мы используем отрицательные двоичные числа, мы действительно просто говорим:

0000 - 0101 = x

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Чтобы "изолировать" х, нам нужно добавить 1, потому что 1111 - это один от 10000, и мы удаляем ведущий 1, потому что мы просто добавили его к исходной разнице.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

Просто удалите 10000 с обеих сторон, чтобы получить x, это базовая алгебра.

Ответ 10

Многие из ответов до сих пор хорошо объясняют, почему два дополнения используются для представления отрицательного числа, но не сообщают нам, что такое два номера дополнения, особенно не почему добавляется "1", а на самом деле часто добавляется неправильно путь.

Путаница исходит из плохого понимания определения номера дополнения. Дополнительным дополнением является недостающая часть, которая сделает что-то завершенным.

Радиус-дополнение числа n цифр x в радиусе b является, по определению, b ^ n-x. В двоичном выражении 4 представляет собой 100, который имеет 3 цифры (n = 3) и радиус 2 (b = 2). Таким образом, его радиус-дополнение является b ^ n-x = 2 ^ 3-4 = 8-4 = 4 (или 100 в двоичном виде).

Однако в бинарном представлении дополнение радиуса не так просто, как получение его уменьшенного дополнения радикса, которое определяется как (b ^ n-1) -y, всего на 1 меньше, чем у дополнения radix. Чтобы получить уменьшенное дополнение radix, вы просто переворачиваете все цифры.

100 → 011 (уменьшенный (один) радиус-дополнение)

чтобы получить дополнение radix (two), мы просто добавим 1, как определено определение.

011 +1 → 100 (два дополнения).

Теперь с этим новым пониманием давайте взглянем на пример, приведенный Винсент Рамдхани (см. Выше второй ответ)

/* начало Vincent

Преобразование 1111 в десятичное:

Число начинается с 1, поэтому оно отрицательно, поэтому мы находим дополнение 1111, которое равно 0000. Добавьте 1 к 0000, и мы получим 0001. Преобразуйте 0001 в десятичный, что равно 1. Примените знак = -1. Тада!

конец Винсента */

Следует понимать как

Число начинается с 1, поэтому оно отрицательное. Итак, мы знаем, что это два дополнения к некоторому значению x. Чтобы найти x, представленное его двумя дополнениями, нам сначала нужно найти его 1 дополнение.

два дополнения x: 1111 одно дополнение к х: 1111-1 → 1110; x = 0001, (перевернуть все цифры)

применить знак -, а ответ = -x = -1.

Ответ 11

Мне понравился lavinio ответ, но смещение бит добавляет некоторую сложность. Часто существует выбор движущихся битов при соблюдении знакового бита или при этом не соблюдающий знаковый бит. Это выбор между обработкой чисел как подписанных (от -8 до 7 для nibble, от -128 до 127 для байтов) или беззнаковых чисел полного диапазона (от 0 до 15 для nibbles, от 0 до 255 для байтов).

Ответ 12

Это умное средство кодирования отрицательных целых чисел таким образом, что примерно половина комбинации битов типа данных зарезервирована для отрицательных целых чисел, а добавление большинства отрицательных целых чисел с их соответствующими положительными целыми числами приводит к переполнение переноса, которое оставляет результат двоичным.

Итак, в 2 дополнениях, если один равен 0x0001, тогда -1 равен 0x1111, потому что это приведет к суммарной сумме 0x0000 (с переполнением 1).

Ответ 13

2s Дополнения: когда мы добавим дополнительный с 1-м дополнением числа, мы получим 2s-дополнения. Например: 100101 его дополнение 1s равно 011010, а дополнение 2s равно 011010 + 1 = 011011 (добавив один с 1 дополнением) Подробнее... эта статья объясняет это графически.

Ответ 14

У меня была такая же проблема несколько недель назад. Я закончил тем, что читал об этом в Интернете из разных источников, пытаясь собрать эти кусочки и написать об этом сам, чтобы убедиться, что я правильно понял. Мы используем два дополнения по двум причинам:

  • Чтобы избежать множественных представлений 0
  • Чтобы избежать отслеживания бит переноса (как в одном дополнении) в случае переполнения.
  • Простые операции, такие как сложение и вычитание, становятся легкими.

Если вы хотите более подробное объяснение этого вопроса, попробуйте статью, написанную мной здесь. Надеюсь, это поможет!

Ответ 15

Слово дополнение происходит от полноты. В десятичном мире цифры от 0 до 9 обеспечивают дополнение (полный набор) цифр или цифровых символов для выражения всех десятичных чисел. В двоичном мире цифры 0 и 1 представляют собой дополнение чисел для выражения всех двоичных чисел. Фактически символы 0 и 1 должны использоваться для представления всего (текста, изображений и т.д.), А также положительного (0) и отрицательного (1). В нашем мире пробел слева от числа считается нулем:

                  35=035=000000035.

В хранилище компьютера нет пустого места. Все биты (двоичные цифры) должны быть либо 0, либо 1. Для эффективного использования числа памяти могут храниться как 8-битные, 16-битные, 32-битные, 64-битные, 128-битные представления. Когда число, которое сохраняется как 8-битное число, передается в 16-битное местоположение, знак и величина (абсолютное значение) должны оставаться неизменными. И 1 дополнение и 2 представления дополнения облегчают это. Как существительное: и 1 дополнение, и 2 дополнения являются двоичными представлениями знаковых величин, где старший значащий бит (один слева) является знаковым битом. 0 для положительного и 1 для отрицательного. 2s дополнение не означает отрицательный. Это означает подписанное количество. Как и в десятичном виде, величина представлена в виде положительной величины. Структура использует расширение знака для сохранения количества при переходе в регистр [] с большим количеством битов:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Как глагол: 2 дополнения означает отрицание. Это не значит сделать негатив. Это означает, что если негатив делает позитивом; если положительный, то отрицательный. Величина является абсолютной величиной:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Эта способность позволяет эффективно вычитать двоичные числа, используя отрицание, затем добавление. a - b = a + (-b)

Официальный способ взять 1 дополнение - для каждой цифры вычесть ее значение из 1.

        1'scomp(0101) = 1010.

Это то же самое, что переключать или инвертировать каждый бит по отдельности. Это приводит к отрицательному нулю, который не очень нравится, поэтому добавление одного к дополнению te 1 избавляет от проблемы. Чтобы отменить или взять дополнение 2s, сначала возьмите дополнение 1s, затем добавьте 1.

        Example 1                             Example 2
         0101  --original number              1101
         1 comp  1010                       0010
         add 1     0001                       0001
         2 comp  1011  --negated number     0011

В примерах отрицание также работает со знаками расширенных чисел.

Добавление:
1110 Carry 111110 Carry 0110 совпадает с 000110 1111 111111 сумма 0101 сумма 000101

вычитание:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Обратите внимание, что при работе с дополнением 2 пустое пространство слева от числа заполняется нулями для положительных чисел, но заполняется нулями для отрицательных чисел. Керри всегда добавляется и должно быть 1 или 0.

ура

Ответ 16

ССЫЛКА: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Я инвертирую все биты и добавляю 1. Программно:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

Ответ 17

2 дополнением данного номера является номер. получил добавлением 1 с 1 дополнением к нет. Предположим, у нас есть двоичный номер: 10111001101 Это 1 дополнение будет: 01000110010 И это 2 дополнения будет: 01000110011

Ответ 18

Побитовое дополнение числа означает переворачивание всех битов в нем. Чтобы дополнить его двумя, мы переворачиваем все биты и добавляем один.

Используя представление дополнения 2s для целых чисел со знаком, мы применяем операцию дополнения 2s для преобразования положительного числа в его отрицательный эквивалент и наоборот. Таким образом, используя в качестве примера отрывки, 0001 (1) становится 1111 (-1) и снова применяя операцию, возвращается к 0001.

Поведение операции в нуле выгодно в том, чтобы дать одно представление для ноля без специальной обработки положительных и отрицательных нулей. 0000 дополняет 1111, который при добавлении 1. переполняется до 0000, давая нам один ноль, а не положительный и отрицательный.

Основным преимуществом этого представления является то, что стандартные схемы сложения для целых чисел без знака дают правильные результаты при их применении. Например, добавляя 1 и -1 в полубайтах: 0001 + 1111, биты переполняются из регистра, оставляя после себя 0000.

Для мягкого введения замечательный Computerphile выпустил видео на эту тему.

Ответ 19

Дополнение 2 по сути является способом придумать аддитивную инверсию двоичного числа. Задайте себе вопрос: учитывая число в двоичной форме, какая битовая комбинация, если добавить ее к исходному числу, сделает результат нулевым? Если вы можете придумать эту битовую комбинацию, то эта битовая комбинация является представлением -ve (аддитивная инверсия) исходного числа; поскольку по определению добавление числа к его аддитивному обратному всегда должно приводить к нулю. Пример: возьмите 101, который является десятичным 5. Теперь задача состоит в том, чтобы придумать битовую комбинацию, которая при добавлении к данной битовой комбинации (101) приведет к нулю. Для этого начните с самого правого бита 101 и для каждого отдельного бита снова задайте тот же вопрос: какой бит следует добавить к биту "этот", чтобы результат был нулевым? продолжать делать это с учетом обычного переноса. После того, как мы закончили с тремя самыми правыми местами (цифры, которые определяют исходное число безотносительно к ведущим нулям), последний перенос переносится в битовой комбинации аддитивного обратного. Кроме того, поскольку мы могли бы хранить в исходном числе, скажем, один байт, все остальные старшие биты в аддитивном обратном также должны быть равны 1, чтобы при добавлении компьютером числа и его аддитивного обратного с использованием "этого" типа хранения (char) результат в этом символе будет все нули.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

Ответ 20

Вы также можете использовать онлайн-калькулятор для вычисления двоичного представления двоичного представления десятичного числа: http://www.convertforfree.com/twos-complement-calculator/

Ответ 21

Самый простой ответ:

1111 + 1 = (1) 0000. Таким образом, 1111 должен быть -1. Тогда -1 + 1 = 0.

Идеально понять все это для меня.