Вопрос

Скажем, я собираюсь вычесть: 0000 0000 - (-1)

то есть (два дополнения)

      0000 0000
    - 1111 1111
      ---------
    = ???? ????

Что случится, мой мозг действительно чертовски со мной прямо сейчас, раньше это было совершенно хорошо, я думаю, что это переполнение, которое меня облажало, может кто -нибудь дать некоторое разрешение на это, пожалуйста :)?

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

Решение

Возьмите дополнение двух подтережений и добавьте его в Minuend.

  0000 0000
- 1111 1111

 ...

  0000 0000
+ 0000 0001
-----------
  0000 0001

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

Это будет (-11..11). Так же, как в десятичных десятиках, знак все еще остается знаком, а (0-X) все еще (-x), если вы не используете побитовую работу вместо простой вычитания.

Вы можете вычесть -1 (двоичный 1111 1111), добавив дополнение его двух, которое составляет 1 (двоичный 0000 0001). Таким образом, в десятичном, 0-(-1) = 0+1 = 1 :-)

То, как аппаратное обеспечение делает это, он переворачивает второй операнд, и выполняет добавление с переносом на наименее значимой полосе бит до 1. Таким образом операнд Нотт и перенос в сете.

Вы можете сделать это карандашом и бумажным стилем, где вы одолжите по номеру рядом с ним, но он кажется немного глупым по сравнению с десятичными числами. С десятичными числами говорят, что 1000 минус 1, ноль справа становится 10, потому что это базовая 10, затем 0 рядом с ним должно заимствовать, что делает его 10, но затем одолжив одно вправо, что делает его 9, это Продолжается до тех пор, пока ваш верхний ряд не станет 9 9 10, и вы вычитаете 0 0 1 и получите 999. С базой 2 0B1000 (что составляет восемь десятичных) минус 0B0001, то же самое происходит, ноль на правых опечатках слева становится 2 или 0B10, потому что, потому что Это база 2, ноль рядом с ним должен заимствовать, а также стать 0B10, а затем одолжить один вправо, что делает его 1 и так далее, так что ваш верхний ряд составляет 1 1 0B10, а нижний ряд - 0 0 1 Вычтите столбцы, и вы получаете 0B111 или 7 десятичных десятиц.

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

Моя интуиция говорит мне, что 0 - (-1) должен быть равен 0+1 , или просто 1 .

Если вы удивляетесь, почему, попробуйте выполнить бит вычитания кусочком:

0 - 1          = 10 - 1     = 1, setting borrow to 1.
0 - 1 - borrow = 10 - 1 - 1 = 0, borrow = 1
etc..

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

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