Микроконтроллер хранит числа как наборы битов, а человеку удобнее десятичная или шестнадцатеричная запись. Один и тот же байт 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) | 1 | 8 | 23 | 127 | ≈ 7 десятичных цифр | 3,4 · 10³⁸ |
| double (binary64) | 1 | 11 | 52 | 1023 | ≈ 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 и сетевые протоколы. Калькулятор показывает оба порядка; если число, принятое по линии, получилось «перевёрнутым», переставьте байты.
Источники
- IEEE 754-2019. IEEE Standard for Floating-Point Arithmetic — форматы binary32 и binary64: знак, смещённый порядок, мантисса, особые значения
- David Goldberg. What Every Computer Scientist Should Know About Floating-Point Arithmetic. ACM Computing Surveys, 1991 — округление, точность и денормализованные числа
- Modbus Organization. MODBUS Application Protocol Specification V1.1b3, 2012 — адреса и данные передаются старшим байтом вперёд (big-endian)
- 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>Обновлено . Нашли ошибку в расчёте? Напишите нам.