Найти тему
Разумный мир

О представлении чисел в ЭВМ. С самого начала

Оглавление

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

Не верите или не согласны? Давайте попробуем разобраться.

Когда то давно я написал статью

Простые типы данных. Машинное представление простых типов. Операции с простыми типами.

Однако, она по большей части основывается на представлении чисел в процессорах Intel x86. Она рассказывает о представлении чисел, но не объясняет, почему это именно так. Сегодня же мы поговорим о том, "почему так".

Кроме того, я немного расскажу и о троичных ЭВМ, так как в комментариях нередко вспоминают о машине Сетунь.

Под ЭВМ в статье понимается исключительно цифровая вычислительная машина.

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

В основе всего бит и математическая логика

Да, именно так. Элементарным кирпичиком любой обрабатываемой ЭВМ информации является бит. И именно с бита мы начнем разбираться. Бит это суть минимальный квант информации, который имеет философское наполнение. Истина или Ложь... Вот в этой статье

От логики философской к логике цифровой. Для школьников и начинающих
Разумный мир29 августа 2021

мы достаточно подробно разбирались с этим вопросом.

И схемотехника процессора основывается именно на работе с отдельными битами. В статье

мы построили универсальную ячейку АЛУ, которая обрабатывала биты. И эта обработка основывалась на математической логике воплощенной в схемотехнике.

Из отдельных бит можно строить более сложные агрегаты данных: тетрады, байты, слова, длинные слова, и т.д. При этом, с точки зрения математической логики, никакой взаимосвязи меду отдельными битами, например, в байте, нет. Байт это группа бит, никак между собой не связанных.

Но все меняется, когда мы начинаем группы бит как то интерпретировать.

От группы бит к целым числам

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

Чтобы понять, что это за взаимосвязь, нам нужно вспомнить про позиционные системы счисления. Я в очередной раз воспользуюсь своей иллюстрацией

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

Здесь показан пример для десятичной системы счисления. Именно эта система счисления используется человеком в обычной жизни.

Эта формула приводится очень часто, в множестве источников. Но что она означает и откуда взялась? Проще всего это объяснить призвав на помощь Фибоначчи и его "задачу о гирях".

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

Разумеется, сразу встает и вопрос о том, какие именно гири, и в каком количестве, есть в наборе. Можно считать, что "N" в степени "i" определяет вес гирь в наборе. То есть, для десятичной системы счисления в наборе будут гири весом 1, 10, 100, 1000 и т.д. Нам сейчас не важно, грамм, килограмм, фунтов, или чего то еще. А цифра "a" определяет количество гирь каждого веса, которые можно положить на чащу весов.

Таким образом, для десятичной системы счисления у нас в наборе есть 9 гирь весом 1, 9 гирь весом 10, и т.д. И нам сразу видно, что десятичная система является удобной и привычной, но не самой оптимальной, так как количество гирь каждого веса, и общее количество гирь в наборе, получается довольно большим.

Если вернуться к нашему примеру, то на чаше весов окажется пять гирь весом 1, две гири весом 10, по одной гире весом 100 и 1000.

Фибоначчи доказал, что когда гири можно размещать только на одной чаше весов, то оптимальной является двоичная система счисления. А если гири можно размещать на обеих чашах весов, то троичная (симметричная!). Нам не интересно само доказательство, но интересно посмотреть, почему это именно так.

Давайте оценим необходимое количество гирь в наборе для измерения веса в пределах до 1000 (максимальный вес 999). Нам потребуются гири трех разных весов, по 9 штук каждого веса. Всего 27 гирь.

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

Двоичная система счисления

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

Гири размещаются только на одной чаше весов. При этом наиболее оптимальна (экономична) двоичная система счисления. Иллюстрация моя
Гири размещаются только на одной чаше весов. При этом наиболее оптимальна (экономична) двоичная система счисления. Иллюстрация моя

Вес гирь при этом пропорционален степеням двойки. То есть, гири имеют веса 1, 2, 4, 8, 16, 32 и т.д. И каждая гиря есть в единственном экземпляре.

Предположим, что нам нужно набрать (измерить) вес равный 78. Для этого потребуется:

  • 1 гиря весом 64
  • 0 гирь весом 32
  • 0 гирь весом 16
  • 1 гиря весом 8
  • 1 гиря весом 4
  • 1 гиря весом 2
  • 0 гирь весом 1

И мы получаем классическое представление числа 78 в двоичном виде - 1001110.

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

Отдельный бит выделен для обозначения знака числа. Иллюстрация моя
Отдельный бит выделен для обозначения знака числа. Иллюстрация моя

В данном случае показан байт, который используется для представления числа со знаком. Но тут у нас возникает небольшая проблема - два нуля. Действительно, 00000000 это просто ноль. А 10000000 это тоже ноль, но со знаком минус. Как минимум, это неудобно.

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

Давайте рассмотрим байт 11111111. Поскольку старший бит, который мы отвели для знака, равен 1. Что бы у нас получился 0, к этому числу нужно прибавить 1. В результате получится 1_00000000, но старшая 1 не помещается в байт, потому результатом будет 0. А значит, 11111111 является двоичным представлением числа минус один.

Смена знака числа, хранящегося в дополнительном коде, выполняется инверсией всех бит этого числа и прибавлением к результату единицы. Рассмотрим это на примере смены знака числа 1

00000001 - число +1

11111110 - после инверсии всех бит числа

11111111 - число -1

Троичная симметричная система счисления

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

Троичная система счисления подразумевает, в стандартном случае, что в ней используются цифры 0, 1, 2. Однако, такая троичная система счисления называется несимметричной. У нее нет особенностей, как и у любой другой, например восьмеричной. А вот симметричная троичная система счисления уже гораздо интереснее.

Что бы понять, как эта система устроена, нам снова нужно обратиться к Фибоначчи и его задаче о гирях. К тому варианту, где гири могут размещаться на обеих чашах весов

Гири размещаются на обеих чашах весов. При этом наиболее оптимальна (экономична) троичная симметричная система счисления. Иллюстрация моя
Гири размещаются на обеих чашах весов. При этом наиболее оптимальна (экономична) троичная симметричная система счисления. Иллюстрация моя

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

Глупо? Отнюдь! Давайте посмотрим, что будет, если мы захотим, математически (это важно!) перенести гирю с левой чаши на правую, но так, что бы весы остались в равновесии. Математика говорит, что это возможно если сменить знак числа. То есть, у нас появляется гиря отрицательного веса! Математически, такое возможно. Но в реальном мире нет, гири с отрицательным весом быть не может

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

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

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

Но это приводит нас к тому, что в системе счисления появляются отрицательные цифры. А, поскольку цифра ноль никуда деться не может, такая хитрая система счисления может существовать только для нечетного основания. В нашем случае, для основания 3 (троичная) будут использоваться цифры -1, 0, 1. Они симметричны относительно нуля. Потому и система счисления симметричная.

Обратите внимание, что такой "математический трюк" сохраняет для системы счисления свойство "позиционная". Приведенная ранее формула остается абсолютно верной!

Давайте посмотрим, как то работает. Поскольку у нас троичная система счисления, то веса гирь будут 1, 3, 9, 27, 81, и т.д. Тут все совершенно стандартно. Теперь давайте попробуем уравновесить наш предмет весом 78, что мы ранее рассматривали для двоичной системы счисления.

Если мы поместим на правую чашу гири 1, 3, 9 и 27, то общий вес будет 40, что недостаточно. А следующая гиря имеет вес 81, что слишком много. Но на правую чашу нам придется положить именно ее. И у нас появляется первая цифра нашего числа в троичной симметричной системе счисления

Первая гиря на правой чаше имеет излишний вес, но других вариантов нет. Первая цифра нашего числа (+1). Иллюстрация моя.
Первая гиря на правой чаше имеет излишний вес, но других вариантов нет. Первая цифра нашего числа (+1). Иллюстрация моя.

Очевидно, что следующую гирю нам надо поставить на левую чашу. Что будет, если мы поставим туда гирю весом 27? Как вы помните, гири на левой чаше мы учитываем со знаком минус. Значит, при этом получим вес

81-27=54

Что меньше нужного нам веса 78. Но и сумма весов оставшихся гирь (1+3+9) будет недостаточной, так как 54+13=67. Значит, нам нельзя ставит гирю весом 27 на левую чашу. И мы получаем вторую цифру нашего числа

Следующую гирю (весом 27) нам нельзя ставить. Значит, очередная цифра числа 0. Иллюстрация моя
Следующую гирю (весом 27) нам нельзя ставить. Значит, очередная цифра числа 0. Иллюстрация моя

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

81-9=72

Что меньше нужного нам веса. Но сумма весов оставшихся гирь опять недостаточна. Значит, очередная цифра нашего числа опять 0

Следующую гирю (весом 9) нам нельзя ставить. Значит, очередная цифра числа 0. Иллюстрация моя
Следующую гирю (весом 9) нам нельзя ставить. Значит, очередная цифра числа 0. Иллюстрация моя

Очередная гиря весом 3, поставленная на левую чашу, наконец то позволяет нам уравновесить весы

81-3=78

Значит, очередная цифра нашего числа -1. Поскольку теперь весы в равновесии, последняя цифра числа будет 0. И мы получаем такое

Запись числа 78 в троичной симметричной системе счисления. Иллюстрация моя
Запись числа 78 в троичной симметричной системе счисления. Иллюстрация моя

В машинах Сетунь цифру -1 записывали как перевернутую 1. Сегодня чаще используют надчеркивание. Суть от этого не меняется. Как сохраняется истинность и формулы для записи числа в позиционной системе счисления.

А что с отрицательными целыми числами? Тут все гораздо проще, чем в двоичной системе счисления. Ведь у нас при записи числа доступны отрицательные цифры. А значит, не требуется выделение отдельного бита для обозначения отрицательных чисел. Точнее, не бита, а трита (трайта). Именно так называется минимальный квант информации при использовании троичной системы счисления. Да и смена знака числа становится проще. Достаточно просто инвертировать все триты числа.

Для смены знака числа в троичной симметричной системе счисления достаточно инвертировать все биты числа. Иллюстрация моя
Для смены знака числа в троичной симметричной системе счисления достаточно инвертировать все биты числа. Иллюстрация моя

То есть, упрощается схемотехника процессора. Даже если рассматривать только целые числа. Отсутствие необходимости отдельно учитывать знак чисел является неоспоримым плюсом, если машина проектируется для инженерных и научных расчетов. А если машина должна быть универсальной?

Немного о машине Сетунь

Машины Сетунь и Сетунь-70 были своего рода экспериментальными. Несмотря на то, что было выпущено чуть менее 50 машин Сетунь, если правильно помню. Эти машины относились к классу малых машин и не обладали выдающимися характеристиками. Впрочем, в те годы (60-е годы прошлого века) многие машины были экспериментальными.

Сетунь была построена на феррит-диодных ячейках. На канале есть статьи о таких логических ячейках

Несмотря на то, что теоретически такие ячейки позволяли хранить состояние трита на одном сердечнике используя разное направление намагниченности и размагниченное состояние для нуля, в Сетуни каждый трит хранился на двух сердечниках. При этом из четырех возможных состояний фактически использовалось только три.

  • 00 и 11 - состояние трита 0
  • 01 - состояние трита -1
  • 10 - состояние трита +1

Это было избыточно, но такова была схемотехника и возможности построение логических элементов тех времен. Сегодня тоже можно хранить триты как два взаимосвязанных бита, но можно использовать и другие способы. Например, разную полярность напряжений в состояниях -1 и +1. В конечном итоге, нам сегодня это не важно. Как не важна и схемотехника.

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

Точнее, это не совсем ухищрения. Просто правила обработки и хранения логических и числовых данных будут разными. На практике оказалось, что машины использующие двоичную систему счисления проще и дешевле. Поэтому Сетунь осталась лишь занимательным экспериментом. Безусловно, интересным и оставившим свой след в истории, но экспериментом. Как и очень многие другие экспериментальные машины разрабатываемые в разных странах.

Заключение

Мы только начали разбираться с представлением чисел в ЭВМ. С самых основ, которые уходят корнями в древние времена, в средневековье, когда математики даже не подозревали, что их труды будут иметь отношение к такому чуду, как ЭВМ. Именно там лежат причины того, что в ЭВМ используется двоичная система счисления. Хотя были и попытки использовать более экзотические, но и более функциональные, системы счисления.

Поскольку Сетунь осталась в прошлом и сегодняшние ЭВМ, в подавляющем большинстве, все таки двоичные, в последующих статьях мы не будем вспоминать Сетунь. Но и двоичных машин нам вполне хватит, что бы увидеть самые разные и очень интересные нюансы представления и обработки чисел.

Приглашаю посетить дружественный канал

Робототехника | Яндекс Дзен

До новых встреч!

Наука
7 млн интересуются