Почему два дополняют? - PullRequest
13 голосов
/ 28 июля 2011

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

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

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

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

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

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

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

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

Ответы [ 6 ]

27 голосов
/ 28 июля 2011

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 )

6 голосов
/ 28 июля 2011

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

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

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

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

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

6 голосов
/ 28 июля 2011

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

Компьютеры представляют отрицательные числа, вычисляя результат, который вы получите, если вычитаете это число из нуля, используя их обычные правила вычитания. То есть, чтобы найти, как -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 голосов
/ 28 июля 2011

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

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

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

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

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

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

Вот еще одна схема кодирования.

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

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

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

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

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

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

1 голос
/ 28 июля 2011

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

Вы можетенайти инверсию любого числа в комплименте двух, щелкая биты и добавляя один.Например, -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 - отрицательное число (все числа со 1 в старшей значащей цифре отрицательны в комплименте двоих).Чтобы узнать его абсолютное значение, мы переворачиваем биты и добавляем 1. 0001 + 1 = 0010 или 2. Следовательно, результат нашего сложения равен -2.4 - 6 -2.Наша математика проверяется.

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

0 голосов
/ 03 ноября 2015

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

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

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

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

Для любого х,

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, все биты установлены = -0), что переводит в большее число операций для выполнения для аппаратных схем, особенно во время операций с числом х и -0. [В Википедии есть хорошие примеры Избегая отрицательного нуля , вы можете посмотреть на них]

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

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