Добавление отрицательного и положительного двоичного файла? - PullRequest
4 голосов
/ 07 декабря 2008

X = 01001001 и Y = 10101010

Если я хочу добавить их вместе, как мне это сделать? Они являются "дополнением двоих" ... Я перепробовал много вещей, но я не совсем уверен, что получаю правильный ответ, поскольку, похоже, существуют другие типы правил.

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

f.eks
01001001 + 10101010 = 11110011 => 00001100 => 1101 => -13

Или же?
1. Конвертировать отрицательный
2. Сложите их вместе и конвертируйте негативные

f.eks
01001001 + 10101010 => 01001001 + 01010110 => 10011111 => 01100001 => -97


Поэтому я хочу взять: X-Y и X + Y
Может кто-нибудь сказать мне, как это сделать?

Некоторые ресурсные сайты: студент-бинарная celtickane Суортмор

Ответы [ 4 ]

12 голосов
/ 07 декабря 2008

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

Ваш первый пример - «просто добавьте их» - является абсолютно правильным ответом. Ваш пример номера

  • 01001001 = 73
  • 10101010 = -86

Итак, правильный ответ действительно -13.

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

Обратите внимание, что все становится интересным - обработка битов переполнения / недостаточного заполнения. Вы не можете представить результат 73 - (-86) как 8-битное число с дополнением до двух ...

1 голос
/ 07 декабря 2008

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

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

Например, используя ваши номера:

X = 01001001: без знака, MSB равен 0, ничего не делать.

Y = 10101010: Подпись, ничего не сделал с Х, все еще ничего не делает.

Но если мы изменим MSB X на 1:

X = 11001001: без знака, MSB равен 1, Добавить 0 -> 011001001

Y = 10101010: расширенный знак со знаком X, поэтому расширенный знак Y -> 110101010

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

1 голос
/ 07 декабря 2008

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

Например, ваше положительное число X = 01001001 становится 10110101 + 1 = 10110110 как отрицательное число; ваше отрицательное число Y = 10101010 становится 01010101 + 1 = 01010110 как положительное число.

Чтобы вычесть Y из X, отрицайте Y и добавьте. И.Е. 01001001 + 01010110.

1 голос
/ 07 декабря 2008

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

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