Найти в Дзене
Компьютерный слон

Компьютеры не умеют вычитать. А зачем это уметь, если ты умеешь складывать?

Компьютеры - интересные существа, и порой кажется, что понять их совершенно невозможно. Но так ли это? Ведь компьютеры были придуманы людьми - а значит, кто-то всё это придумал - двоичный код, алгоритмы, внутреннее устройство компьютера... Если один понял, то и остальные тоже смогут. Кроха сын к отцу пришел, и спросила кроха: "Пап, ну пап! Как компьютеры складывают и вычитают числа?" Папа призадумался. Первое, что ему пришло на ум, так это сказать "Ну... Как-как? Очень просто! Берут и... складывают!" Взял ручку и листок бумаги и написал две строки ноликов и единичек: 0 0 1 0 1 1 0 1 0 0 0 1 1 0 1 0 Вот смотри. Компьютер работает с битами, каждый из которых принимает значение - или ноль, или единицу. Здесь каждая строка - это число. Давай сложим их, справа налево, как обычно: единица плюс ноль равно единице, ноль плюс единица равно единице, в третьем разряде опять получается единица... а вот в четвёртом всё интересно: тут у нас две единицы, и если их сложить, в двоичной системе получит

Компьютеры - интересные существа, и порой кажется, что понять их совершенно невозможно. Но так ли это? Ведь компьютеры были придуманы людьми - а значит, кто-то всё это придумал - двоичный код, алгоритмы, внутреннее устройство компьютера... Если один понял, то и остальные тоже смогут.

Кроха сын к отцу пришел, и спросила кроха: "Пап, ну пап! Как компьютеры складывают и вычитают числа?"

Папа призадумался. Первое, что ему пришло на ум, так это сказать "Ну... Как-как? Очень просто! Берут и... складывают!" Взял ручку и листок бумаги и написал две строки ноликов и единичек:

0 0 1 0 1 1 0 1

0 0 0 1 1 0 1 0

Вот смотри. Компьютер работает с битами, каждый из которых принимает значение - или ноль, или единицу. Здесь каждая строка - это число. Давай сложим их, справа налево, как обычно: единица плюс ноль равно единице, ноль плюс единица равно единице, в третьем разряде опять получается единица... а вот в четвёртом всё интересно: тут у нас две единицы, и если их сложить, в двоичной системе получится 10 (это не десять, а единица в старшем разряде и ноль в младшем). Единица переходит в старший разряд, который находится слева, а там у нас что? Опять единица? Значит, ещё раз увеличится старший разряд. Вот более простой пример:

001 + 011 = 100

Итак, что у нас получается в нашей задачке?

0 0 1 0 1 1 0 1

0 0 0 1 1 0 1 0

-------------------------

0 1 0 0 0 1 1 1

Сын внимательно смотрел на эти записи, и вдруг спросил: "Папа, а что будет, если в левом разряде у обоих чисел будут единички? Мы в ответе должны дописать ещё один разряд слева, верно?"

- И да, и инет, - ответил папа, - С точки зрения математики, мы действительно должны дописать слева ещё один разряд. Но вот с точки зрения компьютера писать этот разряд нам некуда - ведь мы изначально берём для записи чисел фиксированное количество бит, кратное восьми. То есть, взяли мы, скажем, 8 бит (1 байт) для счётчика - и если вдруг окажется, что нам нужно записать число 256 (а при восьми битах мы можем записывать числа только от нуля до 255), то наш счётчик переполнится, говоря простым языком - сломается, и будет показывать... ноль!

- О, так вот как на Youtube сломался счётчик просмотров!

- Точно! Создатели платформы не думали, что какой-то клип могут посмотреть 4 с лишним миллиардов раз - это больше чем половина населения Земли.

- Так что, если при вычислениях происходит переполнение, то это плохо?

- Ну как сказать... Переполнение значения помогает нам вычитать числа, просто складывая их!

- Как так?

- Помнишь, что в математике есть такое правило: вычитание из одного числа другого равноценно прибавлению к первому числу второго, но взятого со знаком минус? А - B = A + (-B)

- Да, мы что-то такое проходили. Получается, что действительно компьютеру не нужно уметь вычитать, достаточно уметь складывать два числа, положительное и отрицательное... Постой! А как компьютер записывает отрицательные числа?

- Хороший вопрос! Для записи отрицательных чисел используется самый старший бит: если он равен нулю, мы имеем дело с положительными величинами, если там стоит единица, число отрицательное. Если мы используем 8 бит для записи целого положительного числа, то можем записать числа от 0 до 255, то есть 256 значений. Если же мы используем эти 8 бит для записи целых чисел, которые могут быть как положительными, так и отрицательными, то диапазон значений составит от -127 до +127

- Хм... А почему вместо 256 значений мы получим 255? Куда потерялось ещё одно значение?

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

- А почему так?

- Хороший вопрос! Давай рассмотрим на примере. У нас есть число "2", которое при трёхбитной записи (здесь мы можем записать любое целое число от минус трёх до трёх) будет иметь вид "010". Вычтем его из нуля (возьмём форму записи "111", которая тоже соответствует нулю). 111-010=101. Это и будет соответствовать числу "-2". Давай проверим это и сложим -2 и 2: 101+010=111, что соответствует нулю!

- Погоди, но ведь компьютер же не умеет вычитать! Как мы получим "-2"?

- Верно, компьютер не умеет вычитать, но он умеет инвертировать число - менять все нули на единицы и наоборот, а в данной ситуации это одно и то же: вместо 010 мы получили 101, то есть сделали инверсию!

- Тогда вычитание представляет собой две операции - инверсию вычитаемого и сложение его с уменьшаемым, правильно?

- Совершенно верно!

- Ну и ну! Прямо как в старой кавээновской шутке про казахов, у которых нет слова "назад", а есть только "вперёд" - "алга!", и когда им нужно поехать назад, они разворачивают лошадь - и "алга!"

- Хорошее сравнение, а главное - помогает запомнить, как компьютер вычитает числа.