Почему два дополнения?
Я пишу учебник для обучения детей (от 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. [Википедия имеет приятные примеры в Избегание отрицательного нуля, вы можете посмотреть на них]
Надеюсь, это объяснение успокоит умы ваших детей...