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

Обновлено: 21.11.2024

Как компьютеры выполняют математические операции? Я имею в виду, похоже, что математическая часть — это самая основная функция компьютера.

Но я имею в виду, откуда он ЗНАЕТ, что 1+1=2?

Чтобы дать представление, я понимаю двоичный код: 1+1=10. У меня есть элементарное представление об ассемблере, я пытался программировать на нем много лет назад, поэтому я мог посмотреть на это:

двигать топор, 1
добавить топор, 1

Но как это добавить 1 к ax, а затем получить значение 2? (или b10).

Я почти вижу, как могут работать как shl, так и shr (это квадрат и квадратный корень?), но сдвигая биты, но не добавляя и т. д.

Я предполагаю, что микрочип (x86?) должен быть предварительно запрограммирован, чтобы знать порядок чисел.. Но я понятия не имею. Может ли кто-нибудь пролить свет на это?

Ответы и ответы


Вы имеете в виду 1, 2, 3, 4, . как "порядок чисел"? Если так, то нет, компьютер не запрограммирован на бесконечный ряд чисел.

Ну, я знаю, что могу добавлять числа, потому что я могу визуализировать это. Я вижу, что если у меня есть три объекта и я возьму еще 4 объекта, то теперь я могу насчитать 7 объектов. Но как это делает компьютер?

Даже это уравнение: 4+1=5. Если вы просто поместите значение "4" в компьютер и добавите к нему значение 1, как он узнает, как складывать?

Как вы добавляете от 1 до 4? Наверное "интуитивно", потому что это простые числа. А как насчет 412793 + 23871?

Если вы скажете компьютеру добавить от 1 до 4, он сначала возьмет оба числа и преобразует их в двоичные числа. 1 становится 1, 4 становится 100. Теперь он складывает их 1 + 100 = 101 и преобразует ответ обратно в десятичный вид: 5.

Думаю, я плохо доношу то, о чем пытаюсь спросить.

Откуда компьютер знает, как сложить 1 + 100, чтобы получить 101? Я имею в виду, как запрограммировать компьютер, чтобы он мог складывать числа?

Давайте начнем с 4 пустых регистров и назовем их A, B, C и R. Мы хотим добавить A к B, использовать регистр C для переноса результатов и R для хранения результата. (Очевидно, что внутри компьютера это делается намного эффективнее, но я пытаюсь все упростить.)

Первоначально:
C = 0000
A = 1011
B = 0011
R = 0000

Компьютер идет справа налево и делает следующее: складывает* два бита в A и B, сохраняет результат в регистре R. После первой операции регистры выглядят так:

C = 0010
R = 0000

Это потому, что 1 + 1 = 10, поэтому мы помещаем 0 в результат и сохраняем 1 в переносе. Теперь компьютер переходит ко 2-й паре битов, снова 1 и 1. 1 + 1 = 10, но у нас также есть перенос из предыдущего! Таким образом, он добавляет перенос к результату 10 + 1 = 11 и регистрирует его:

C = 0110
R = 0010

И это повторяется снова и снова, пока не будет готово.

* Возможно, вы до сих пор не понимаете, как компьютер может складывать 1 и 1, или 1 и 0, или 0 и 0. Это просто и может быть сделано с помощью двух вентилей, AND и XOR. Рассмотрим следующую таблицу истинности:

Если (A XOR B) равно 1, результат равен 1. В противном случае результат равен 0. Что касается переноса, который определяется результатом (A AND B) - если он равен 1, то перенос, иначе нет.

Еще раз подчеркну, что компьютер делает это намного эффективнее. Например, он не использует целый регистр для переноса — он использует один бит в специальном флаговом регистре, чтобы узнать, был ли перенос в последней операции. Кроме того, результат сохраняется не в совершенно новом регистре, а в одном из регистров A или B (как вы, наверное, догадались по внешнему виду команды ADD в ассемблере).

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

Чтобы понять более сложные темы, нам нужно начать с простого. Как компьютер интерпретирует число? Опять же, вы можете кричать «что такое 42+42?» сколь угодно громко в железную балку, но она не откликнется (по крайней мере, в нашем поколении!)

Десятичная – знакомая нам система счисления

В нашей повседневной жизни мы работаем в десятичной системе счисления с основанием 10. Считается, что это связано с тем, что у людей обычно десять пальцев, и на ранних стадиях мы используем их для счета. Десятичный предлагает 10 различных цифр, 0-9. Иногда вы можете услышать, как кто-то называет свои пальцы рук или ног «цифрами», так же как каждое число является цифрой.

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

Мы можем записать 1572 как: (1*1000) + (5*100) + (7 * 10) + (2 * 1). Каждую группировку в таблице мы умножаем на десять. Это можно переписать так:

Важное отличие для тех, кто не разбирается в математике: все в степени 0 равно 1. Это пригодится позже. Почему, я оставлю доказательство в качестве упражнения для читателя.

Двоичная система счисления компьютеров

Считается, что термин «бинарная система» был введен Готфридом Лейбницем в 1869 году в его работе «Explication de l'Arithmétique Binaire». Это означает, что в системе счисления всего две разные цифры (отсюда и приставка bi, как и bipod- двуногий). Эти цифры равны 0 или 1. Двоичный код считается основанием 2, так как есть два варианта.

Наша предыдущая таблица использовала основание 10, но теперь мы работаем с основанием 2. Простая замена (замена 10 на 2) дает нам то, что будет работать для двоичного, а не для десятичного числа:

Хорошо. Но как пользоваться этой штукой? Ну, я упоминал ранее, что двоичный код может быть только 0 или 1. Если я выберу четырехзначный поток 0 или 1, то есть 0101, и введу его в нашу таблицу (идентично примеру 1572 с основанием 10), мы получим следующее:

Это дает (0 * 2^3) + (1 * 2^2) + (0 * 2^1) + (1 * 2^0) или 4+1. Таким образом, мы видим, что 0101 (по основанию 2) = 5 (по основанию 10).

Логика — правда или ложь?

Зачем возиться с двоичным кодом? Вы можете быть намного более выразительным в десятичном виде, так как там гораздо больше цифр, верно? Ну нет. Двоичный может отображать все, что может десятичный, просто для этого может потребоваться больше цифр. Ранее мы видели, что 5 соответствует 0101.

Джордж Буль (1815–1864) был математиком, который разработал метод алгебры, который позволяет нам, учитывая определенные входные данные, логически оценить, каким должен быть результат. Информатика изменила некоторые из первоначальных обозначений Буля, но по сути он дал нам такие инструменты, как И, ИЛИ, НЕ, XOR и т. д.

Для каждой из следующих таблиц мы берем два входа (названные произвольно A и B) и применяем к ним операцию. Последний столбец — результат операции.

И Таблица правды

И не требует пояснений; Я хочу что-то сделать только в том случае, если и A, и B верны:

ИЛИ Таблица истинности

ИЛИ верно, если A, B или оба верны:

НЕ Таблица правды

NOT немного отличается от другого тем, что принимает только один ввод. Он отрицает ввод, т.е.:

Таблица истинности XOR

Исключающее ИЛИ немного сложнее объяснить; Я хочу что-то сделать, если А не то же самое, что Б.

Простая двоичная арифметика

Двоичное сложение работает так же, как десятичное сложение:

  • Действуя справа налево (наименьшая значащая цифра вверх), сложите два числа.
  • Возможно, вам придется перенести цифру, если результат превышает значение, которое вы можете отобразить в виде одной цифры
    • т.е. в базе 10 9 + 6 = 15. Это то же самое, что и 5, перенос 1.

    Выше приведена принципиальная схема, показывающая, как это достигается:

    • Сначала два входа, A и B, передаются в логический элемент XOR (с изогнутым краем) для вычисления суммы.
    • Затем A и B передаются в логический элемент И (прямоугольный) для вычисления переноса.

    Это пример схемы «полусумматора». Полный сумматор должен учитывать потенциальный перенос из предыдущего расчета.

    < td >01
    ABПеренос (A AND B)Сумма (A XOR B)Результат
    111010
    0101
    100101
    000000

    Обратите внимание, что строки 2 и 3 в приведенной выше таблице дают 01. Это связано с тем, что сложение является коммутативным процессом: 7 + 5 по основанию десяти равно 5 + 7. В случае с таблицей мы добавление одних и тех же двух чисел дважды и, следовательно, получение одного и того же результата.

    Мы можем продемонстрировать полный процесс сложения, как показано ниже, сгруппировав схему Half Adder в блок для повторного использования/упрощения:

    Заключение

    Судя по тому, что мы здесь рассмотрели, компьютер на самом деле не такой уж и умный. Да, довольно изящно взять немного металла и заставить его делать домашнее задание по математике, но, в конечном счете, он не выполняет никаких операций, которые не мог бы выполнить 10-летний ребенок. Мы узнаем о позиционном обозначении (то есть тысячах, сотнях и т. д.) с самого раннего возраста, а также о том, как складывать. Единственная разница между компьютером и 10-летним ребенком в этом смысле — эффективность и точность; компьютеры не замедляются, когда они устали или им скучно.

    Компьютеры превращают каждое число в двоичное. Числа, которые мы используем, выражены в базе 10. Каждые 10 единиц равняются 1 десятку, каждые 10 десятков равняются 1 сотне и так далее. В двоичном формате вы поднимаетесь на единицу каждые 2 числа. Таким образом, 2 единицы равны 1 двойке, 2 двойки равны 1 4 и так далее. Например, число 9 будет 1001 в двоичном формате: 1 единица, 0 двоек, 0 четверок и 1 восьмерка. 1 + 8 = 9. Компьютеры делают это, потому что проще проектировать схемы, которые имеют только значения 1 или 0, чем схемы с 10 отдельными значениями каждая.

    Дополнение

    В компьютерах запрограммированы основные математические операции, такие как сложение и вычитание. Добавление в двоичном формате чрезвычайно просто. Если у вас есть 2 числа со значением 1, вы сохраняете 0 и переносите 1. В противном случае вы записываете большее из двух чисел в этот слот. Например, если вы сложите 5 + 4, вы получите: 0101 + 0100. В первом слоте у вас есть 1 + 0, поэтому вы сохраняете большее число, 1. Во втором слоте у вас есть два 0, поэтому вы сохраняете 0 (поскольку оба числа одинаковы. В третьем слоте у вас есть две единицы, поэтому вы сохраняете 0 и несете 1. В итоге вы получите число 1001 или 9.

    Умножение.

    Компьютеры используют длинное умножение, но в двоичном формате. Если компьютер умножает число на 1, он возвращает 1. Это гораздо более простая система, чем 10-кратная, хотя и требует больше шагов. Например, в системе счисления 10 задача 8 * 9 — это простая одношаговая задача без длинного умножения. Однако в двоичном формате каждое число состоит из 4 цифр, а решение состоит из 7 цифр!

    Вычитание

    Вычитание выполняется в два этапа. Вместо того, чтобы вычитать число, двоичный компьютер добавляет его дополнение, число с единицами, где исходное число имеет нули, и нулями, где исходное число имеет единицы. Например, тогда как 4 — это 0100 в двоичном формате, отрицательное 4 — это 1011. Таким образом, для 7 — 4 мы получаем 0111 + 1011 = 10010. Затем число в самой левой части сдвигается вправо, что дает нам 0011 = 3.< /p>

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

    Эта глава из книги

    Эта глава из книги

    Эта глава из книги 

    Группа Sales Force Automation вашей компании имеет очень большую базу данных размером 50 ГБ. Данные разделены между тремя файлами из соображений производительности: DBFile1, DBFile2 и DBFile3. Вам разрешено не более 60 минут простоя этой базы данных.

    У вас есть следующий график резервного копирования базы данных:

    Тип резервного копированияДниВремя
    Полное резервное копирование Понедельник2:00 AM
    Полное резервное копирование файлов DBFILE1Вторник2: 00:00
    Полное резервное копирование файлов DBFILE2Среда2:00
    Полное резервное копирование файла DBFILE3Четверг2:00 AM
    Резервное копирование журнала транзакций Ежедневно11:00
    Резервное копирование журнала транзакцийЕжедневно19:00

    В среду в 9:00 физический носитель файла DBFile1 был поврежден. Какие шаги вы предпримете для восстановления базы данных за отведенное время? Вы не можете создать резервную копию текущего журнала транзакций.

    С этой главой вы сможете вступить в ряды немногих, гордых, людей завтрашнего дня, развивая понимание нескольких языков программирования. В этой главе основное внимание уделяется более ранним языкам программирования, некоторые из которых используются до сих пор. Вы узнаете, как появились языки программирования и как они развивались на протяжении многих лет.

    Основные моменты этой главы включают следующее:

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

    Код ASCII определяет двоичные шаблоны для каждого символа, представляемого компьютером.

    Самые ранние компьютеры программировались с помощью проводов.

    FORTRAN и COBOL многие годы были предпочтительными языками для науки и бизнеса.

    На протяжении многих лет правительство предпочитало использовать ADA.

    Хранение программ и данных

    Когда вы печатаете на клавиатуре, как вы думаете, что происходит, когда вы нажимаете клавиши? Уходит ли буква A куда-то в память компьютера, когда вы нажимаете клавишу A? Так и должно быть, иначе компьютер никогда не сможет запомнить содержимое вашей программы. Компьютер хранит A, но не в том формате, в котором вы могли бы ожидать. Компьютер хранит только представление буквы A. Во всех смыслах буква A находится в памяти, но не выглядит так, как вы думаете.

    Причина, по которой требуется восемь переключателей, заключается в том, что если бы их было меньше, то не хватило бы комбинаций включенных и выключенных состояний для представления всех возможных символов (прописных, строчных, цифр и специальных символов, таких как %, ^, и *).

    Помните, что ваш компьютер — это не что иное, как тысячи выключателей, которые включают и выключают электричество. Каждый символ на вашем компьютере представлен комбинацией переключателей включения и выключения. Программисты обычно называют выключатель «1» (единица), а «выкл» — 0 (ноль). Поскольку эти переключатели имеют только два значения, программисты называют 0 и 1 двоичными цифрами или битами для краткости. Всего на каждый символ в вашем компьютере приходится восемь бит, и восемь бит известны как байт. Таким образом, для представления каждого символа памяти требуется восемь битов (восемь переключателей включения и выключения), и, следовательно, символ представляет собой байт.

    Несколько лет назад кто-то записал различные комбинации восьми единиц и нулей от 00000000 до 11111111 и присвоил каждой из них уникальный символ. Таблица символов была стандартизирована и сегодня известна как Таблица ASCII (произносится как аск-и, поэтому, если вы не знаете-и, вы можете использовать ASCII). Таблица 3.1 показывает частичный список таблицы ASCII. ASCII расшифровывается как Американский стандартный код для обмена информацией.

    Таблица 3.1. Значения ASCII представляют символы

    Каждому из значений ASCII соответствует соответствующее десятичное число. Эти значения показаны справа от восьмибитных значений в таблице 3.1. Следовательно, даже если компьютер представляет символ ? как 00111111 (два выключателя с шестью включенными), вы можете с помощью программирования обратиться к этому значению ASCII как 63, и ваш компьютер будет знать, что вы имеете в виду 00111111. Одно из преимуществ языков программирования высокого уровня заключается в том, что они часто позволяют вам используйте более простые (для людей) десятичные значения, а язык программирования преобразует значение в восьмибитное двоичное значение, используемое внутри компьютера.

    Как видно из значений ASCII в таблице 3.1, каждый символ в компьютере, будь то прописные и строчные буквы, и даже пробел, имеет свое собственное уникальное значение ASCII. Уникальный код ASCII — это единственный способ, с помощью которого компьютер может различать символы. Некоторые мейнфреймы используют аналогичную систему, которая называется таблица EBCDIC, произносится как eb-se-dik.

    Вспомните внутреннее хранилище отдельных символов, описанное ранее в этом разделе. Когда вы нажимаете букву А, эта А не сохраняется в вашем компьютере; вместо этого сохраняется ASCII-значение A. Как видно из значений ASCII в предыдущей таблице, буква A представлена ​​как 01000001 (все восемь переключателей, кроме двух, выключены в каждом байте памяти, содержащем букву A).

    Как показано на рис. 3.1, когда вы нажимаете букву A на клавиатуре, в память попадает не буква A, а значение ASCII 01000001. Компьютер сохраняет этот шаблон включения и выключения в этой ячейке памяти до тех пор, пока там остается буква А. Что касается вас, то в памяти буква А остается как буква А, но теперь вы точно знаете, что происходит. Если вы печатаете программу, которую только что набрали, и компьютер готов напечатать символ, хранящийся в этой ячейке памяти, центральный процессор компьютера отправляет код ASCII для буквы A на принтер. Непосредственно перед печатью принтер знает, что его вывод должен быть удобочитаемым для людей, поэтому он ищет 01000001 в своей собственной таблице ASCII и печатает букву А на бумаге. С того момента, как буква А покинула клавиатуру, и до момента, когда она была напечатана, это была вовсе не буква А, а просто комбинация восьми единиц и нулей, представляющая букву А.

    Таблица ASCII не сильно отличается от других типов кодированных таблиц, о которых вы, возможно, слышали. Азбука Морзе представляет собой таблицу представлений букв алфавита. Вместо единиц и нулей код использует комбинации тире и точек для представления символов. Штрихи и точки обозначают длину радиосигналов, которые люди отправляют или принимают. Буквы SOS представлены ТОЧКА-ТОЧКА-ТОЧКА ТИРЕ-ТИРЕ-ТИРЕ ТОЧКА-ТОЧКА-ТОЧКА.

    Вы когда-нибудь задумывались, как компьютеры и калькуляторы, которые представляют собой не что иное, как бессмысленные коробки из пластика, проводов и других странных деталей, ухитряются складывать числа? И так быстро! Math Dude знает ответ.

    В настоящее время у нас возникают проблемы с воспроизведением в Safari. Если вы хотите послушать аудио, используйте Google Chrome или Firefox.

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

    Обзор: булева алгебра

    Последние несколько недель мы пытались выяснить, как складывают компьютеры и калькуляторы. Мы начали с двоичной системы счисления, затем рассказали о некоторых трюках с двоичными числами и о том, как выполнять двоичное сложение, а затем поговорили о чем-то, что называется булевой алгеброй. Первое, что нужно помнить о булевой алгебре, это то, что это тип математики, который имеет дело с битами, а не с числами, к которым вы привыкли. Что немного? Это просто двоичная цифра, и она может быть равна 1 (иначе "истина") или 0 (иначе, "ложь") и ничему другому.

    Вторая важная вещь, которую нужно помнить о булевой алгебре, — это ее 3 основные операции: И, ИЛИ и НЕ. Что они делают? Ну, НЕ просто возвращает вам значение, противоположное биту, который вы ему даете. Таким образом, НЕ 0 равно 1, а НЕ 1 равно 0. И и ИЛИ оба принимают значения двух битов и возвращают вам 1 или 0. И возвращает вам 1, только если оба входных бита равны 1, и ИЛИ возвращает 1, если один (или оба) входных бита равны 1. Удивительно, но эти три операции — НЕ, И и ИЛИ — являются ключом к пониманию того, как компьютеры складывают.

    Страницы

    Об авторе

    Джейсон Маршалл — автор книги Краткое и грязное руководство по алгебре для чувака-математика. Он дает четкие объяснения математических терминов и принципов, а его простые приемы решения основных задач по алгебре заставят даже самого математическо-фобного человека с нетерпением ждать решения любой математической задачи, которая встретится им на пути.

    Читайте также: