Бинарное вычитание
-
11-10-2019 - |
Вопрос
Скажем, я собираюсь вычесть: 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 состоит в том, чтобы обеспечить простой способ выполнения вычитания, добавив взаимного вместо этого.