Как компьютер представляет числа: биты, hex и IEEE 754

Число и его запись не одно и то же. Количество сорок пять можно записать как 45 в десятичной системе, 101101 в двоичной или 2D в шестнадцатеричной, и во всех трёх случаях значение останется прежним. Меняется только алфавит цифр и правило, по которому позиция каждой цифры превращается в её вес.
Позиционная запись отделила значение от набора знаков
В десятичном числе 472 последняя цифра обозначает две единицы, следующая семь десятков, а первая четыре сотни. Та же схема работает с любым основанием b: разряды справа налево имеют веса b⁰, b¹, b² и далее. Поэтому 2D в системе с основанием 16 читается как 2 × 16 + 13, где буква D заменяет цифру со значением 13.
Позиционный принцип не появился однажды в одном месте. Вавилонские математики использовали шестидесятеричную запись, однако долго обходились без однозначного знака для пустого разряда. Позднее индийская математика соединила десятичную позиционную запись с нулём как заполнителем позиции и самостоятельным числом. Эта система перешла к учёным исламского мира, а в Европе одним из важных проводников стал Фибоначчи, описавший индийские цифры и знак нуля в Liber Abaci 1202 года. История была сложнее простого «изобретения нуля в V веке»: обозначение пустого места, символ нуля и арифметика с нулём формировались в разные периоды, что хорошо видно в обзоре истории нуля Университета Сент-Эндрюса.
Главное преимущество такой записи состоит не в основании 10, а в одном повторяемом правиле для чисел любого размера. Ноль устраняет неоднозначность пустых позиций, а алгоритмы сложения и умножения работают разряд за разрядом. Если заменить десять цифр двумя, принцип останется тем же.
Двоичная арифметика стала полезной, когда встретилась с логическими схемами
В 1703 году Готфрид Вильгельм Лейбниц опубликовал Explication de l'Arithmétique Binaire, где показал, как выражать числа только знаками 0 и 1. Он не был первым человеком, заметившим двоичные последовательности, но дал систематическое описание арифметики и связал её с более широкой математической программой.
До вычислительной техники одной компактности идеи было недостаточно. Практический мост появился тогда, когда логические операции научились сопоставлять состояниям переключателей. В магистерской работе 1937 года Клод Шеннон применил булеву алгебру к релейным и переключательным схемам, благодаря чему проектирование логики можно было свести к формулам над двумя состояниями.
Фраза «транзистор включён или выключен» передаёт общую идею, но слишком упрощает физику. Реальное устройство различает диапазоны напряжения, заряд, магнитное состояние или другой устойчивый носитель информации, а уже инженерная модель называет два состояния нулём и единицей. Двоичная логика удобна потому, что между двумя допустимыми диапазонами можно оставить запас от помех и собрать из одинаковых элементов сложные операции.
Восьмеричная и шестнадцатеричная запись помогают человеку читать биты
Компьютер не переводит данные в hex перед вычислением. Восьмеричная и шестнадцатеричная системы нужны прежде всего человеку, потому что их основания являются степенями двойки. Одна восьмеричная цифра точно заменяет три бита, а одна hex-цифра четыре, поэтому двоичную строку можно перегруппировать без арифметики:
45₁₀ = 101101₂ = 55₈ = 2D₁₆
101 101 0010 1101
5 5 2 D
Восьмеричная запись особенно подходила машинам с длиной слова, кратной трём. Например, руководство DEC описывает 12-битное слово PDP-8 как диапазон от 0000₈ до 7777₈, то есть четырьмя восьмеричными цифрами. Это наследие сохранилось в правах Unix: каждая цифра в 755 или 644 упаковывает три флага чтения, записи и выполнения для одной группы пользователей.
Hex стал естественнее рядом с байтовой памятью, поскольку две цифры описывают все 256 комбинаций восьми битов. Представленная в 1964 году архитектура IBM System/360 закрепила 8-битный байт в одной совместимой семье машин, а шестнадцатеричная запись оказалась удобной для адресов и дампов памяти. Сегодня тот же принцип виден в цветах #RRGGBB, MAC-адресах, кодовых точках Unicode и хэшах. Основания вроде 32 или 36 решают другую задачу: они не группируют биты без остатка, зато позволяют короче записывать целые идентификаторы с помощью цифр и латинских букв.

Одна битовая строка не сообщает, положительное перед нами число или отрицательное
Запись в некотором основании описывает математическое целое, а машинное слово дополнительно требует соглашения о длине и знаке. Биты 11111111 дают 255, если читать их как беззнаковое восьмибитное число, и −1, если применить дополнительный код. Для n битов two's complement оставляет диапазон от −2^(n−1) до 2^(n−1)−1; отрицательные значения располагаются в верхней половине всех комбинаций, благодаря чему обычное двоичное сложение работает и для них.
Поэтому преобразование −45 в −2D не является показом внутреннего представления процессора. Это та же знаковая математическая запись в другом основании. Чтобы получить конкретный набор битов дополнительного кода, нужно сначала выбрать разрядность, например 8, 16, 32 или 64 бита. Без неё вопрос не имеет единственного ответа.
IEEE 754 описывает не ещё одно основание, а формат приближённых чисел
Целые значения удобно хранить разрядами, но для очень больших, очень малых и дробных чисел нужна форма, похожая на научную запись. В binary floating point число выражается через знак, значащую часть и степень двойки. Формат binary32 хранит один бит знака, восемь бит смещённого показателя и 23 бита дробной части; для нормальных чисел ведущая единица значащей части подразумевается. Описание Oracle показывает точное расположение этих полей.
Ограниченная значащая часть означает, что представимы не все реальные числа. Десятичная дробь 0,1 в двоичной системе продолжается бесконечно, поэтому binary32 или binary64 вынуждены её округлить. Это не ошибка реализации, а прямое следствие конечного формата; классическое объяснение с разложением 0.1 приведено в статье What Every Computer Scientist Should Know About Floating-Point Arithmetic.
Первая версия IEEE 754 была принята в 1985 году при заметном участии Уильяма Кэхэна, а действующая редакция IEEE 754-2019 определяет форматы, операции, округление и обработку особых случаев. Нули, бесконечности, NaN и очень малые subnormal-числа кодируются особыми комбинациями полей. Стандарт значительно сократил различия между платформами, но сам по себе не обещает, что любой численный алгоритм даст одинаковый ответ при иной последовательности операций или другом промежуточном округлении.
Буквенные системы сохраняют значение по другим правилам
Римские, ивритские и греческие числа полезны как напоминание о том, что не всякая числовая запись позиционная. Римская форма складывает и иногда вычитает значения символов; привычное MCMLXXXIV означает 1984, но исторические надписи не всегда следовали современному канону. Поэтому предел 3999 и отклонение форм вроде IIII в конвертере являются чётким соглашением инструмента, а не универсальным законом римской записи.
В ивритской записи буквам также назначены значения, а знаки гереш и гершаим помогают обозначать числительное. Сочетания для 15 и 16 традиционно переставлены, чтобы не получать последовательность букв божественного имени. Греческая милетская система распределяет буквы по единицам, десяткам и сотням; Unicode описывает верхнюю керайю как знак числительного, а нижнюю перед буквой как множитель на тысячу. Эти записи можно преобразовать в целое, но у них нет общего алгоритма смены основания, который работает для 101101, 45 и 2D.
Что именно делает Number Base Converter
Number Base Converter использует BigInt, поэтому точно переводит целые произвольного размера между основаниями 2–36 и принимает отрицательный знак. Поля binary, octal, decimal, hex и custom radix двусторонние; для цифр после 9 используются буквы A–Z. Спецификация ECMAScript действительно определяет BigInt как целое без фиксированной разрядности, поэтому большие значения не проходят через неточный JavaScript Number.
Отдельные поля преобразуют канонические римские числа от 1 до 3999, ивритскую запись от 1 до 999 999 и греческую от 1 до 9999. Для римских чисел ввод проверяется обратным преобразованием, а у ивритских тысяч есть оговорённая неоднозначность: одинокая буква с герешем читается как небольшое число, если после неё нет остатка.
Блок IEEE 754 берёт десятичный ввод, округляет его до Float32 и показывает 1 бит знака, 8 бит exponent и 23 бита fraction, подписанные в интерфейсе более привычным словом mantissa. Он не переводит дроби между основаниями, не показывает binary64 и не интерпретирует отрицательные целые как дополнительный код заданной длины. Все вычисления выполняются локально в браузере, введённые значения никуда не отправляются.
Похожие инструменты
Частые вопросы
Что означает основание системы счисления?
Основание определяет набор цифр и вес соседних разрядов. В системе с основанием b каждый следующий разряд слева имеет вес в b раз больше предыдущего, поэтому запись 2D в hex означает 2 × 16 + 13, то есть 45 в десятичной системе.
Почему компьютеры используют двоичную систему?
Цифровую схему удобно строить на двух устойчиво различимых логических состояниях. Им можно сопоставить 0 и 1, а операции над ними описать булевой алгеброй. Конкретная электроника может кодировать состояния уровнями напряжения, зарядом, намагниченностью или другим физическим способом.
Что такое дополнительный код?
Дополнительный код, или two's complement, интерпретирует n-битное слово как число от −2^(n−1) до 2^(n−1)−1 и позволяет складывать положительные и отрицательные значения одной двоичной схемой. Например, 11111111 означает 255 без знака, но −1 в 8-битном дополнительном коде. Для такой интерпретации обязательно знать разрядность и знаковость.
Почему 0,1 нельзя точно представить в обычном binary floating point?
Дробь 1/10 содержит в знаменателе множитель 5, поэтому в системе с основанием 2 она превращается в бесконечную периодическую запись. Формат хранит конечное количество битов значащей части и округляет её до ближайшего представимого значения.
Какие ограничения есть у Number Base Converter?
Позиционные поля работают с целыми числами через BigInt и не переводят дроби между основаниями. Отрицательные значения выводятся со знаком, а не как слово фиксированной разрядности в дополнительном коде. IEEE-блок показывает поля округлённого Float32, но не является полным декодером всех форматов IEEE 754.
Автор
Alex RelFullstack Engineer
В коммерческой разработке с 2011 года — больше 15 лет. Автор двух SaaS-продуктов: TeleGo.io и LingvoHabit.com. Статьи здесь выросли из реальной клиентской и продуктовой работы.



