2016-06-22 3 views
0

Может кто-нибудь, пожалуйста, скажите мне, как два дополнения дополняют следующие 9 и -10.Как вычесть 9 и -10 в дополнение к двум?

для 9 бинарного значения = 1001
для 10 бинарного значения = 1010

принять двоичное дополнение к -10 = 0110

9 = 1001 и -10 = 0110 речь идет, как наконец 1111. = 15

но ответ придет -1

ответ

3

Короткий ответ -10 не может быть представлена ​​в виде 4-битового целого числа в двоичном коде комплимента. Вы получаете переполнение - обратите внимание, что бит знака для 0110 равен 0! (То же самое верно и в отношении 9 - примечание, что бит знака равен 1.)

Настоящий ответ заключается в том, что если вы делаете это вручную, вам нужно выделить буфер, достаточно большой для обработки вашего ввода (и вывод). Если вы используете 8 бит, например, должно быть ясно, что происходит:

  • 9 = 00001001
  • -10 = двойки комплимент 00001010 = 11110101 + 00000001 = 11110110
  • 00001001 + 11110110 = 11111111 = -1

Теперь, как говорится, если вы игнорируете о verflow логика позади математики все еще работает:

1111 не является 15 для 4-разрядного целого числа со знаком. Знак бит (самый старший бит) равен 1, что указывает на отрицательный результат, поэтому вам нужно интерпретировать его как отрицательный номер комплимента двух, в данном случае -1.

Обратите внимание, что 1111 15 для 4-битового беззнаковых целого числа, а также больших размера подписал целые числа (которые будут в действительности быть 00...01111 и бит знака равно 0).

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

  • Binary: 1001 + 0110 = 1111
  • Подпись (переполнение): (!) 9 + -10 (!) = -1
  • Unsigned: 9 + 6 = 15
  • Signed (правильный): -7 + 6 = -1

Поэтому крайне важно, вы последовательны в подписанном Несс на протяжении всей операции/программы. В вашем заявлении «9 = 1001 и -10 = 0110 он приходит как окончательно 1111. = 15» вы смешиваете подписанную интерпретацию (-10 = 0110) - игнорируя переполнение курса - без знака (1111 = 15) , что приводит к ошибке.

+0

Благодарим вас за разъяснение – user306128

+0

Пожалуйста, примите решение (http://meta.stackexchange.com/a/5235/155831), если оно помогло решить проблему. Также просмотрите остальные вопросы [перечисленные в вашем профиле] (http://stackoverflow.com/users/4101535/user306128) и посмотрите, можете ли вы выбрать правильный ответ для них. Это помогает всем. –

2

Основная причина, по которой результат неверен, состоит в том, что с 4-битными номерами вы можете представлять только числа от -8 до 7. Если вы хотите записать 9 и -10 в дополнение к двум, вам понадобятся 5 бит (это будет 01001 и 10110).

Затем 01001 + 10110 = 11111 = -1.

+0

как '10110' приходит, вы можете кратко рассказать мне – user306128

+0

Точно так же вы добрались до' 0110' за -10: 10 = '01010' => -10 =' 10101' + '1' =' 10110' Просто инвертируя и добавляя 1, как обычно для дополнения двух. – Akko