Что такое «Дополнение 2»? - PullRequest
393 голосов
/ 26 июня 2009

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

Следовательно, я хотел бы начать этот пост community wiki , чтобы определить, что такое дополнение Two, как его использовать и как оно может влиять на числа во время операций, таких как приведение (от подписи до неподписания и наоборот), побитовые операции и операции сдвига битов.

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

Ответы [ 20 ]

2 голосов
/ 26 ноября 2014

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

2 голосов
/ 20 июня 2012

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

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

1 голос
/ 14 апреля 2019

Слово дополнение происходит от полноты. В десятичном мире цифры от 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'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.

Приветствия

1 голос
/ 16 октября 2017

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

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

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

1 голос
/ 26 июня 2009

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

0 голосов
/ 15 февраля 2019

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

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

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

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

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

0 голосов
/ 07 января 2019

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

0 голосов
/ 30 декабря 2016

ССЫЛКА: 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;
0 голосов
/ 22 сентября 2016

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

0 голосов
/ 25 сентября 2015

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

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

Это прекрасно, чтобы понять все это для меня.

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