Вопрос

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

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

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

Это было полезно?

Решение

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

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

По сути, это говорит:

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

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

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

Это все, что мы можем сказать о позитиве.23-1 = 7.

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

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

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

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

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

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

Другие советы

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

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

Сначала рассмотрим целое число без знака, хранящееся в 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 +
----

?

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

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

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

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

  2. Если число положительное, то все готово.например5 — это 0101 в двоичном формате с использованием двоичного дополнения.

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

    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. Число начинается с 1, поэтому оно отрицательное, поэтому мы находим дополнение к 1111, что равно 0000.

  2. Прибавляем 1 к 0000 и получаем 0001.

  3. Преобразуйте 0001 в десятичное число, то есть 1.

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

Тада!

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

Напомним, как это работает для десятичной дроби:
  2345
это способ письма
  2 × 103 + 3 × 102 + 4 × 101 + 5 × 100.

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

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

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

К счастью, компьютеры не представляют бесконечности.Числа ограничены определенной длиной (или шириной, если хотите).Итак, вернемся к положительным двоичным числам, но определенного размера.Для этих примеров я буду использовать 8 цифр («битов»).Таким образом, наше двоичное число на самом деле будет
  00001111
или
  0 × 27 + 0 × 26 + 0 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 1 × 20

Чтобы сформировать отрицательное дополнение до 2, мы сначала дополняем все (двоичные) цифры, чтобы сформировать
  11110000
и добавьте 1 в форму
  11110001
но как понять, что это означает -15?

Ответ в том, что мы меняем значение старшего бита (самого левого).Этот бит будет 1 для всех отрицательных чисел.Изменение будет заключаться в изменении знака его вклада в значение числа, в котором он появляется.Итак, теперь наш 11110001 понимается как представляющий
  -1 × 27 + 1 × 26 + 1 × 25 + 1 × 24 + 0 × 23 + 0 × 22 + 0 × 21 + 1 × 20
Обратите внимание на «-» перед этим выражением?Это означает, что знаковый бит имеет вес -2.7, то есть -128 (по основанию 10).Все остальные позиции сохраняют тот же вес, который они имели в беззнаковых двоичных числах.

Вырабатывая наш -15, это
  -128 + 64 + 32 + 16 + 1
Попробуйте это на своем калькуляторе.сейчас -15.

Из трех основных способов представления отрицательных чисел в компьютерах, дополнение до 2, несомненно, выигрывает по удобству общего использования.Однако у него есть странность.Поскольку он двоичный, возможных битовых комбинаций должно быть четное.Каждое положительное число можно соединить со своим отрицательным, но ноль только один.Отрицание нуля дает вам ноль.Итак, есть еще одна комбинация, число с 1 в знаковом бите и 0 где-либо еще.Соответствующее положительное число не соответствует количеству используемых битов.

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

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

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

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

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

Что я понял:

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

Сделайте то же самое с негативом! (с небольшой поправкой)

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

за первое число вместо 23 * 1 = 8 , сделать -(23 * 1) = -8.

затем продолжайте как обычно, делая -8 + (22 * 1) + (21 * 0) + (20 * 1) = -3

Представьте, что у вас есть конечное число бит/тритов/цифр/что угодно.Вы определяете 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.

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

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

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

Я прочитал фантастическое объяснение на Реддите автор 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 лет).

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

Нам нужно получить комплиментную часть от 12, чтобы вычесть ее из 10.12 в двоичном формате — это 00001100.10 в двоичном формате — это 00001010.

Чтобы получить дополняющую часть числа 12, мы просто поменяем местами все биты, а затем прибавим 1.12 в перевернутом двоичном формате — 11110011.Это также Обратный код (дополнение до единицы).Теперь нам нужно добавить один, который теперь равен 11110100.

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

Теперь вы можете решить поставленный выше вопрос 10–12 в двоичной форме.

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

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

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

Добавляем дополнение из 24, что на самом деле равно (100 – 24).Так что на самом деле все, что мы делаем, это добавляем 100 в обе части уравнения.

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

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

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

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

По этой причине после дополнения до девяти мы добавляем 1.Как вы, наверное, знаете из детской математики, 9 становится 10, если «украсть» 1.По сути, это просто дополнение до десяти, которое отнимает 1 от разницы.

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

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

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

Поскольку цепочки единиц на 1 ниже хорошей степени двойки, они «крадут» 1 из разницы, как это делают девятки в десятичной системе счисления.

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

0000–0101 = х

1111 - 0101 = 1010

1111 + 0000 - 0101 = х + 1111

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

1111 + 1 + 0000 - 0101 = х + 1111 + 1

10000 + 0000 - 0101 = х + 10000

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

Многие из ответов на данный момент хорошо объясняют, почему дополнение до двух используется для представления отрицательного числа, но не говорят нам, что такое число дополнения до двух, особенно почему добавляется «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 меньше, чем у дополнения по основанию.Чтобы получить уменьшенное дополнение по системе счисления, нужно просто перевернуть все цифры.

100 -> 011 (уменьшенное (свое) дополнение по системе счисления)

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

011 +1 -> 100 (дополнение до двух).

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

/* начало Винсента

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

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

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

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

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

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

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

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

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

Итак, в дополнении до 2, если один равен 0x0001, то -1 равен 0x1111, потому что в результате общая сумма составит 0x0000 (с переполнением 1).

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

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

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

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

Слово «дополнение» происходит от слова «полнота».В десятичном мире цифры от 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 — для отрицательного.Дополнение до 2 не означает отрицательное.Это означает количество со знаком.Как и в десятичном формате, величина представляется как положительная величина.В структуре используется расширение знака, чтобы сохранить количество при переходе в регистр [] с большим количеством битов:

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

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

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

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

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

        1'scomp(0101) = 1010.

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

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's 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.

Ваше здоровье

ССЫЛКА: 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;

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

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

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

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

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

Для нежного вступления замечательные Компьютерфилы подготовили видео по теме.

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

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

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

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

1111 + 1 = (1)0000.Значит, 1111 должно быть -1.Тогда -1+1=0.

Для меня прекрасно все это понимать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top