Перейти к содержанию

Конвертер систем счисления

Введите число в любой системе — калькулятор покажет его в шестнадцатеричном, двоичном, десятичном и восьмеричном виде с учётом разрядности, как целое со знаком и без, как float или double и по байтам. Биты можно переключать мышью — так удобно собирать значение регистра.

Исходные данные

0xFF9C, 0b1010_0101, -100, 377 в выбранной системе

Разрядность, бит
Биты — нажмите, чтобы переключить

Результат

Шестнадцатеричное
0xFF9C
16 бит, 2 байт
Без знака (uint16_t)
65 436
Со знаком (int16_t)
−100дополнительный код
Двоичное
1111 1111 1001 1100
Восьмеричное
177634
Байты
FF 9Cстарший первым; младший первым — 9C FF

Микроконтроллер хранит числа как наборы битов, а человеку удобнее десятичная или шестнадцатеричная запись. Один и тот же байт 0x9C — это 156 без знака, −100 со знаком и часть float, если он входит в 32-битное слово. Калькулятор показывает все эти прочтения одновременно для выбранной разрядности.

Системы счисления

Шестнадцатеричная система — удобная запись двоичной: каждая цифра 0–F соответствует ровно четырём битам, поэтому байт — это две цифры, а 32-битный регистр — восемь. Восьмеричная система делит число на группы по три бита; в электронике она встречается редко, но в C число с ведущим нулём, например 017, — восьмеричное, и это частая ошибка.

РазрядностьБез знакаСо знаком (дополнительный код)
8 бит0…255−128…127
16 бит0…65 535−32 768…32 767
32 бита0…4 294 967 295−2 147 483 648…2 147 483 647
64 бита0…18 446 744 073 709 551 615−9 223 372 036 854 775 808…9 223 372 036 854 775 807

Дополнительный код

Отрицательное число −x в N битах записывается как 2N − x. На практике это «инвертировать биты и прибавить единицу»: 100 = 0x0064, инверсия — 0xFF9B, плюс один — 0xFF9C. Сложение и вычитание при этом выполняются одинаково для чисел со знаком и без, поэтому процессору не нужны отдельные команды.

Одни и те же биты читаются по-разному в зависимости от типа переменной: 0xFF9C в uint16_t — 65 436, в int16_t — −100. Ошибки на этом стыке типичны: показание 16-битного датчика температуры в дополнительном коде, сохранённое в беззнаковую переменную, вместо −1 °C превращается в огромное положительное число.

float и double по IEEE 754

ФорматБит знакаПорядокМантиссаСмещение порядкаТочностьМаксимум
float (binary32)1823127≈ 7 десятичных цифр3,4 · 10³⁸
double (binary64)111521023≈ 16 десятичных цифр1,8 · 10³⁰⁸

Значение нормализованного числа — (−1)знак · 1,мантисса · 2порядок − смещение. Порядок из одних нулей означает ноль или денормализованное число, из одних единиц — бесконечность или NaN. Например, 0x40490FDB: знак 0, порядок 128 (то есть 2¹), мантисса 0x490FDB — это 3,14159274, ближайшее к π значение float.

Порядок байтов

Многобайтное число лежит в памяти по-разному. STM32, AVR при компиляции GCC и x86 хранят его младшим байтом вперёд (little-endian): 0x12345678 занимает в памяти байты 78 56 34 12. Сетевые протоколы и Modbus передают старшим байтом вперёд (big-endian): 12 34 56 78.

Из-за этого 32-битное значение, принятое по Modbus в двух регистрах, у разных устройств складывается по-разному: порядок байтов внутри регистра задан спецификацией, а порядок самих регистров — нет. Если float из прибора получился бессмысленным, попробуйте переставить регистры и байты и сравнить результат с ожидаемым значением.

Биты регистра

Биты в калькуляторе нумеруются с нуля от младшего. Нажатие на бит переключает его, и все представления пересчитываются — так удобно собирать значение регистра настройки или разбирать прочитанный статус. В программе на C отдельный бит n устанавливают как reg |= 1u << n, сбрасывают — reg &= ~(1u << n), проверяют — reg & (1u << n).

Значения регистров таймеров и делителей UART удобнее считать специальными калькуляторами: таймеры микроконтроллеров и скорость UART. Байты строк в разных кодировках — в таблице ASCII.

Частые вопросы

Как перевести число из шестнадцатеричной системы в двоичную?

Каждая шестнадцатеричная цифра — это ровно четыре бита, поэтому цифры переводятся по отдельности: F — 1111, 9 — 1001, C — 1100. Так 0xFF9C — это 1111 1111 1001 1100. Обратный перевод — группами по четыре бита справа. С восьмеричной системой то же самое, только группы по три бита.

Что такое дополнительный код?

Способ записи отрицательных целых, которым пользуются практически все процессоры: −x в N битах — это 2ᴺ − x, или «инвертировать все биты и прибавить единицу». Так −100 в 16 битах — 0xFF9C, а −1 — все единицы. Старший бит показывает знак. Диапазон N-битного числа со знаком — от −2ᴺ⁻¹ до 2ᴺ⁻¹ − 1: для int16_t это −32 768…32 767.

Как перевести HEX во float?

Выберите разрядность 32 бита и введите шестнадцатеричное значение, например 0x40490FDB, — калькулятор покажет 3,14159274, то есть π, округлённое до float. Обратно: выберите «Дробное число → float/double» и введите 3.14159. По IEEE 754 float состоит из бита знака, 8 бит порядка со смещением 127 и 23 бит мантиссы.

Почему 0,1 нельзя точно записать во float?

В двоичной системе 0,1 — бесконечная периодическая дробь, как 1/3 в десятичной. Float хранит ближайшее представимое число: 0x3DCCCCCD, это 0,100000001490116. Поэтому дробные числа нельзя сравнивать на точное равенство, а деньги и счётчики лучше хранить в целых: в копейках, миллиамперах, тиках таймера.

Что такое порядок байтов (endianness)?

Порядок, в котором байты многобайтного числа лежат в памяти или идут по линии. При little-endian первым идёт младший байт: 0x12345678 в памяти STM32 — 78 56 34 12. При big-endian — старший, так передают данные Modbus и сетевые протоколы. Калькулятор показывает оба порядка; если число, принятое по линии, получилось «перевёрнутым», переставьте байты.

Источники

  1. IEEE 754-2019. IEEE Standard for Floating-Point Arithmetic — форматы binary32 и binary64: знак, смещённый порядок, мантисса, особые значения
  2. David Goldberg. What Every Computer Scientist Should Know About Floating-Point Arithmetic. ACM Computing Surveys, 1991 — округление, точность и денормализованные числа
  3. Modbus Organization. MODBUS Application Protocol Specification V1.1b3, 2012 — адреса и данные передаются старшим байтом вперёд (big-endian)
  4. STMicroelectronics. RM0008: STM32F101xx–STM32F107xx reference manual — разд. 3.3: байты хранятся в памяти в формате little-endian
Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/number-converter/" title="Конвертер систем счисления" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/number-converter/">Конвертер систем счисления</a> — GAW.ru</p>
Автоподстройка высоты рамки

Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.

<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>

Обновлено . Нашли ошибку в расчёте? Напишите нам.