Разные базы хороши для разных целей.
- Десятичная дробь - это, очевидно, то, с чем большинство людей знает, как справиться, поэтому она хороша для вывода реальных количеств конечным пользователям.
- Шестнадцатеричный код является коротким и имеет четное соотношение ровно 2 символов на байт, поэтому он удобен для выражения больших чисел, таких как хэши SHA1 или закрытые ключи и т. П., В формате с возможностью ввода типов, особенно потому, что эти числа на самом деле не представляют количество, поэтому пользователям не нужно понимать их как числа.
- Восьмеричное значение в основном по унаследованным причинам - коды доступа к файлам UNIX традиционно выражаются в виде восьмеричных чисел, например, потому что три бита на цифру хорошо соответствуют трем битам на пользовательскую категорию схемы кодирования прав UNIX.
Иногда хочется использовать числа в одной базе для целей, для которых нужна другая база. Таким образом, доступны различные функции преобразования. На самом деле, однако, мой опыт показывает, что на практике вы почти никогда не конвертируете много из одной базы в другую, за исключением преобразования чисел из некоторой недвоичной базы в двоичную (в форме собственного целочисленного типа вашего языка выбора) и возврата в любую базу вам нужно вывести. Большую часть времени вы переходите от одной недвоичной базы к другой, когда узнаете о базах и почувствуете, как выглядят числа в разных базах, или при отладке с использованием шестнадцатеричного вывода. Даже тогда, если компьютер делает это, основной метод состоит в том, чтобы преобразовать в двоичную систему и затем вернуться обратно, потому что современные компьютеры по своей природе просто хороши в работе с числами base-2 и не так хороши во всем остальном.
Одно важное место, где вы видите числа, которые на самом деле хранятся и обрабатываются в десятичном виде, - это в некоторых финансовых приложениях или других, где важно сохранить точность уровня «число-десятичное-место». Иногда арифметика с фиксированной запятой может работать для валюты, но не всегда, и если она не использует двоичную с плавающей запятой, это плохая идея. Более старые системы фактически поддерживали это в форме двоично-десятичной арифметики. В BCD каждые 4 бита действуют как десятичная цифра, поэтому вы отказываетесь от части каждых 4 бит хранения в обмен на поддержание вашего уровня точности в базовом выборе некомпьютерного мира.
Как ни странно, есть один общий вариант использования для других баз, который немного скрыт. Современные языки с поддержкой большого числа (например, тип long
Python 2.x или тип BigInteger
и BigDecimal
Java) обычно хранят числа внутри массива, причем каждый элемент является цифрой в некоторой базе. Затем они реализуют математику, которую поддерживают на строках цифр этой базы. Действительно эффективные реализации bigint могут фактически использовать основание, приближающееся к 2 ^ (биты в машинном собственном размере слова); очевидно, что базовое число 2 ^ 64 невозможно эффективно вывести в этой форме, но выполнение вычислений кусками такого размера приводит к тому, что наилучшим образом используется пространство и процессор. (Я не знаю, является ли это лучшей базой; может быть, лучше использовать основание, равное половине этого числа битов, чтобы упростить обработку переполнения от одной цифры к другой. Прошло некоторое время с тех пор, как я написал свой собственный bigint, и я никогда не реализовывал более быстрые / более сложные версии умножения и деления.)