Из шестнадцатеричной в десятичную: придаём значению смысл
Что делает эта конвертация
Инструмент читает значение в основании 16 и пересказывает его в основании 10. Шестнадцатеричная удобна машине и тому, кто сравнивает битовые шаблоны, но для порогов, размеров буферов и всего, что человек оценивает на глаз, нужна десятичная цифра. Это то направление, к которому прибегают, когда инструмент выдал значение и перестал что-либо объяснять.
Веса разрядов — степени 16
Справа налево каждая шестнадцатеричная цифра умножается на 1, 16, 256, 4096 и так далее. Для 1E90FF значение равно 1 × 16 в пятой степени плюс 14 × 16 в четвёртой и далее, что даёт 2003199. Арифметика та же взвешенная сумма, что и в любой системе: меняются только веса, поэтому метод одинаково работает и для двоичной, и для восьмеричной.
Таблица перевода из шестнадцатеричной системы в десятичную
Шестнадцатеричные значения, которые регулярно попадаются при отладке и в веб-разработке, и их десятичные эквиваленты. Запоминать стоит круглые шестнадцатеричные числа: они отмечают границы байтов и страниц памяти.
| Шестнадцатеричная | Десятичная |
|---|---|
| 0 | 0 |
| 1 | 1 |
| F | 15 |
| 10 | 16 |
| 7F | 127 |
| A5 | 165 |
| FF | 255 |
| 1000 | 4096 |
| FFFF | 65535 |
| DEADBEEF | 3735928559 |
Что именно расшифровывают на практике
Три повторяющиеся задачи — прочитать канал цвета, сверить адрес памяти с границей и превратить усечённый хеш во что-то сравнимое. Цвет — самый наглядный пример: 0x1E90FF распадается на 30, 144 и 255, и сразу видно, что синий канал насыщен, а красный слаб. То же трёхшаговое чтение применимо к любому упакованному значению, и оно даётся гораздо легче, когда байты разделены.
Разделите значение до перевода
Шестизначный цвет или длинный адрес удобнее читать парами цифр, ведь каждая пара — это байт. Перевести значение целиком годится для одного ответа, но именно разбиение показывает, какой байт выбивается из ряда, — а это обычно и есть настоящий вопрос.
Частые вопросы
Как перевести шестнадцатеричное число в десятичное вручную?
Умножьте каждую цифру на её вес — 1, 16, 256, 4096 и дальше справа налево — и сложите результаты. Помните, что A — это 10, B — 11 и так до F, то есть 15. Для 1E90FF получится 1048576 + 917504 + 36864 + 0 + 240 + 15, то есть 2003199.
Почему адреса памяти выглядят как длинные шестнадцатеричные числа?
Потому что они естественно выровнены по границам байтов и слов, а шестнадцатеричные цифры ложатся на эти границы так, как десятичные не ложатся. Две шестнадцатеричные цифры — один байт, поэтому ведущие цифры адреса описывают страницу, а хвостовые — смещение внутри неё.
Можно вставить значение с префиксом 0x?
Да, префикс распознаётся и отбрасывается перед переводом, поэтому значение, скопированное прямо из отладчика или исходника, работает без правок. Префикс, не соответствующий этой странице, вызывает сообщение об ошибке, а не молча игнорируется, так что неверно прочитанное значение не проскочит.
Насколько большим может быть шестнадцатеричное значение?
Шестьдесят четыре бита и заметно больше. Значения на верхней границе этого диапазона превышают то, что точно хранит обычная плавающая точка, поэтому перевод идёт в точной целочисленной арифметике и возвращает все цифры верно, а не округлённый ответ, какой дала бы таблица.
Имеет ли префикс хеша смысл как число?
Арифметически да, практически нет. Перевести первые байты хеша в десятичное число полезно, чтобы заметить закономерность или сравнить значения в скрипте, но усечённый хеш уже потерял свойство, которое делало его хешем, поэтому не стоит считать десятичную запись самостоятельным идентификатором.