Десятичные преобразования немного медленнее, но на самом деле не намного сложнее. Давайте посмотрим на шестнадцатеричное преобразование немного более похоже на то, что мы, вероятно, написали бы его в реальном коде. Например, в C ++ вы можете выполнить преобразование примерно так:
char digits[] = "0123456789abcdef";
std::string result;
int input = 0xFA20;
while (input) {
int digit = input & 0xf; // or: digit = input % 0xf;
input >>= 4; // or: input /= 16;
result.push_front(digits[digit]);
}
Однако сейчас у него есть магические числа. Давайте избавимся от них:
const int base = 16;
while (input) {
int digit = input % (base - 1);
input /= base;
result.push_front(digits[digit]);
}
В процессе избавления от этих магических чисел мы также сделали подпрограмму почти универсальной - если мы изменим значение «base», остальная часть подпрограммы все еще будет работать и преобразует входные данные в указанный база. По сути, единственное другое изменение, которое нам нужно сделать, - это добавить больше в массив «цифры», если мы хотим поддерживать базы больше 16.
Это также игнорирует несколько вещей для простоты. Очевидно, что если число отрицательное, вы обычно устанавливаете флаг, конвертируете в положительное число и, в конце, если флаг был установлен, вставляете «-» в строку). С дополнением 2 есть угловой регистр для максимально отрицательного числа, которое не может быть преобразовано в положительное число (без преобразования в тип с большим диапазоном). Обычно вы справляетесь с этим, продвигая большинство типов. Для вашего наибольшего целочисленного типа (который вы не можете рекламировать) обычно проще всего жестко закодировать это одно значение.
В принципе, числа с плавающей точкой не сильно отличаются - вы все равно в основном делаете математические манипуляции для генерации одной цифры за раз. Фактически, это становится более сложным просто потому, что вам обычно приходится иметь дело с парой различных форматов (по крайней мере, «базовая» с плавающей запятой и своего рода «научным» форматом), а также с переменными ширины и точности поля. К тому времени, когда вы разберетесь с этим, у вас будет несколько сотен строк кода или около того - не слишком возмутительно, но, возможно, немного больше, чем имеет смысл включать сюда.