Почему два дополнения?

Я пишу учебник для обучения детей (от 9 до 13 лет) о программировании. Я начал с самих компьютеров, у них не так много общего с информатикой, это больше связано с процессом, связанным с решением вычислительной проблемы.

С этой отправной точкой я направляю их к пониманию того, что машины могут помочь нам с определенными вычислительными проблемами. Люди отлично справляются с абстрактным мышлением и воображением, но компьютеры УДИВИТЕЛЬНЫ при соблюдении четко определенной процедуры. Они могут делать это снова и снова, с невероятной скоростью!

Представление чисел в двоичном формате уже описано в моем учебнике. Но как вы представляете отрицательные числа? Существует так много способов сделать это в любой нотной системе, но система, выбранная для компьютеров, имеет очень специфическую причину: уменьшить количество механизмов, связанных с добавлением знаковых целочисленных значений. Мы не хотим создавать и создавать отдельные чипы только для обработки отрицательных чисел, мы хотим использовать те же чипы, которые мы использовали для арифметики натуральных чисел!

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

Мои конкретные вопросы:

  • Как компьютеры представляют отрицательные числа?

  • Почему компьютеры представляют отрицательные числа таким образом?

Я бы предположил, что многим опытным разработчикам придется немного подумать об этом. Некоторые могут даже не придумать ответа. Я не пытаюсь быть помпезным, это из реального опыта, я задал профессиональным разработчикам этот вопрос, и они не могут ответить на него. Они рисуют пустой взгляд. Дайте им JBoss и JavaBeans, и они будут парировать вас с уверенностью. Настолько смешно! Я тоже борюсь с этим вопросом, я должен каждый раз напоминать себе об ответах, и мне нужен лист бумаги или белая доска для разработки решения. Я надеюсь, что это поможет ученикам лучше понять машину, с которой они работают.

Ответы

Ответ 1

1. Как компьютеры представляют отрицательные числа?

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

2. Почему компьютеры представляют собой отрицательные числа таким образом?

Легко добавить 7 в -7 и получить нуль. Операции бит выполняются быстро.


Как это упрощается?

Возьмите пример 7 и -7. Если вы представляете 7 как 00000111, чтобы найти -7 инвертировать все биты и добавить один:

11111000 -> 11111001

Теперь вы можете добавить следующие стандартные правила математики:

  00000111
+ 11111001
-----------
  00000000

Для компьютера эта операция относительно проста, поскольку она включает в себя в основном сравнение по частям и перенос.

Если вместо этого вы представляли -7 как 10000111, это не имеет смысла:

  00000111
+ 10000111
-----------
  10001110 (-14)

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

И не забывайте, что сказал @trashgod, в 2 дополнениях у вас есть только один ноль. Чтобы проверить это:

00000000
11111111 (инвертировать все биты)
00000000 (добавить один)

В отличие от 00000000 (0), равного 10000000 (-0)

Ответ 2

Как компьютеры представляют отрицательные числа?

Компьютеры представляют отрицательные числа, вычисляя результат, который вы получите, если вы вычтете это число с нуля, используя их обычные правила для вычитания. То есть, чтобы найти, что выглядит -5 в двоичном формате, вы вычитаете 5 (в двоичном формате) из 0 (в двоичном формате):

0  0  0  0 -
0  1  0  1
----------

              (borrow)
-> 1 -> 1 -> 1 ->10 -
   0    1    0    1
   ----------------
   1    0    1    1

.. поэтому -5 выглядит как 1011 в двоичном формате.

Почему компьютеры представляют собой отрицательные числа таким образом?

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

Ответ 3

Почему компьютеры представляют собой отрицательные числа таким образом?

Две большие причины, о которых я могу думать:

  • Простота основных арифметических операций. Вам не нужно беспокоиться о проверке знакового бита, чтобы решить, добавлять или вычитать.
  • Единственность представления. Приятно не беспокоиться о отрицательном нуле, так как нет никакого способа представить отрицательный ноль в двух дополнениях.

Из Википедии:

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

Ответ 4

Запишите числовую строку

-32768... -1, 0, 1, 2,... 32767

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

Мы можем использовать "подписанную величину", где знак и значение являются отдельными. Это запутывает, потому что у нас есть две параллельные числовые строки с разными знаками.

Альтернативой "знаковой величине" является кодирование каждого числа в качестве другого номера.

Мы можем добавить смещение 32768 ко всем номерам. Новый диапазон - это unsigned 0 to 65535. Все по-прежнему работает, не так ли? У вас есть фиксированное значение смещения, применяемое ко всем числам. Добавьте шаги вправо. Вычитание перемещается влево. 32768 можно декодировать до 0. 0 можно декодировать до -32768.

Это прекрасно работает. "Кодирование" числа просто добавляет смещение. "Декодирование" числа просто вычитает смещение.

Здесь другая схема кодирования.

Переместите все отрицательные числа на другую сторону цифровой линии.

0, 1, 2,..., 32767, -32768,... -1

Сложение по-прежнему перемещается вправо. Возьмите любое число (за одним исключением). Число справа от него всегда больше.

Единственное исключение - 32767. Число справа от него - "переполнение".

Вычитание все равно перемещается влево. Возьмите любое число (за одним исключением). Число слева всегда меньше. Единственное исключение - -32768. Число слева от него "underflow".

Кодирование и декодирование немного более сложны. От 0 до 32767 имеют тривиальное кодирование и декодирование: ничего не делайте. Цифры кодируются как сами. 32768 до 65535, однако, являются кодировками отрицательных чисел.

Ответ 5

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

Вы можете найти инверсию любого числа в двух комплиментах, перевернув биты и добавив один. Например, -1 будет представлен следующим образом в четырехбитовой реализации:

 1: 0001
-1: 1110 + 1 = 1111

Вы можете проверить это, добавив два:

 0001 + 1111 = 10000

Мы работаем с четырьмя битами, поэтому результат усечен. Теперь мы имеем 0000, или 0. Мы добавили число и его негатив и получили нуль. Ура!

Теперь, для последнего примера, пусть 4 - 6. 4 представляется как 0100. 6 представляется как 0110. Чтобы получить -6, переверните биты и добавьте один: 1001 + 1 = 1010. 0100 + 1010 = 1110. 1110 - отрицательное число (все числа с a 1 в самой значащей цифре отрицательны в двух комплиментах). Чтобы узнать его абсолютное значение, мы переворачиваем биты и добавляем 1. 0001 + 1 = 0010, или 2. Поэтому результат нашего добавления -2. 4 - 6 -2. Наша математика проверяется.

Поздравления. Вы теперь точно так же умны, как компьютер.

Ответ 6

Q1. Как компьютеры представляют собой отрицательные числа?

2 комплиментный метод!

Q2. Почему компьютеры представляют собой отрицательные числа таким образом?

Вот как работает 2 комплимента:

Для любого x,

x + ~x   = all the bits set  
x + ~x   = 2^m - 1      (2^m = the range of numbers we opt)  
  -x     = ~x + 1 - 2^m (we can cancel out mod 2^m, which gives)  
  -x     = ~x + 1 

Как вы можете видеть, 2 комплимента логичны и легко реализуются и не имеют угловых случаев, и поэтому они предпочтительнее других методов.
Давайте рассмотрим 1 комплимент, метод с угловыми случаями, о которых я говорил, в которых существуют 0 и -0 (все биты не установлены = 0, все бит set = -0), что приводит к большему количеству операций, выполняемых для аппаратных схем, особенно во время операций с числом x и -0. [Википедия имеет приятные примеры в Избегание отрицательного нуля, вы можете посмотреть на них]

Надеюсь, это объяснение успокоит умы ваших детей...