Откуда взялись восьмеричные/шестнадцатеричные обозначения?[закрыто]

StackOverflow https://stackoverflow.com/questions/1835465

  •  11-09-2019
  •  | 
  •  

Вопрос

После всего этого времени мне ни разу не пришло в голову задать этот вопрос;Я понимаю, что это пришло из С++, но какова была причина этого:

  • Указывайте десятичные числа, как вы Обычно
  • Укажите восьмеричные числа с ведущим 0
  • Укажите шестнадцатеричные числа, начиная с 0x.

Почему 0?Почему 0х?Существует ли естественное развитие базы 32?

Это было полезно?

Решение

C, прародитель C++ и Java, был первоначально разработан Деннисом Ричи для PDP-8 в начале 70-х годов.Эти машины имели 12-битное адресное пространство, поэтому указатели (адреса) имели длину 12 бит и наиболее удобно представлялись в коде тремя 4-битными восьмеричными цифрами (первое адресуемое слово было бы 000-восьмеричным, последнее адресуемое слово - 777-восьмеричным).

Восьмеричная запись плохо отображается в 8-битные байты, поскольку каждая восьмеричная цифра представляет три бита, поэтому всегда будут лишние биты, которые можно представить в восьмеричной записи.Байт, содержащий все ИСТИНА (1111 1111), имеет номер 377 в восьмеричном формате, а FF в шестнадцатеричном.

Большинству людей проще конвертировать в двоичный формат и обратно в уме, поскольку двоичные числа обычно выражаются блоками по восемь (потому что это размер байта), а восемь — это ровно две шестнадцатеричные цифры, но шестнадцатеричная запись была бы неуклюжей. и вводил в заблуждение во времена Денниса (подразумевая возможность адресации 16 бит).Программистам необходимо мыслить в двоичном формате при работе с оборудованием (где каждый бит обычно представляет собой физический провод) и при работе с побитовой логикой (где каждый бит имеет значение, определяемое программистом).

Я полагаю, что Деннис добавил префикс 0 как простейший возможный вариант повседневных десятичных чисел, который легче всего было различить теми ранними анализаторами.

Я считаю, что шестнадцатеричное обозначение 0x__ было добавлено в C немного позже.Дерево синтаксического анализа компилятора, позволяющее отличить друг от друга числа 1–9 (первая цифра десятичной константы), 0 (первая [незначительная] цифра восьмеричной константы) и 0x (указывающее шестнадцатеричную константу, которая будет следовать в последующих цифрах). сложнее, чем просто использовать ведущий 0 в качестве индикатора для переключения с анализа последующих цифр как восьмеричных, а не десятичных.

Почему Деннис спроектировал именно так? Современные программисты не стоит понимать, что управление этими ранними компьютерами часто осуществлялось путем переключения инструкций на ЦП путем физического переключения переключателей на передней панели ЦП или с помощью перфокарты или бумажной ленты;все среды, где экономия нескольких шагов или инструкций означает значительную экономию ручного труда.Кроме того, память была ограничена и дорога, поэтому сохранение даже нескольких инструкций имело большое значение.

В итоге:0 для восьмеричного числа, потому что оно было эффективно анализируемо, а восьмеричное число было удобно для пользователя на PDP-8 (по крайней мере, для манипулирования адресами).

0x для шестнадцатеричного числа, вероятно, потому, что это было естественное и обратно совместимое расширение стандарта восьмеричного префикса, которое все еще относительно эффективно анализировалось.

Другие советы

Нулевой префикс для восьмеричного числа и 0x для шестнадцатеричного числа появились еще на заре Unix.

Причина существования восьмеричной системы возникла тогда, когда появилось оборудование с 6-битными байтами, что сделало восьмеричный формат естественным выбором.Каждая восьмеричная цифра представляет 3 бита, поэтому 6-битный байт представляет собой две восьмеричные цифры.То же самое относится и к шестнадцатеричному коду, начиная с 8-битных байтов, где шестнадцатеричная цифра состоит из 4 битов и, следовательно, байт представляет собой две шестнадцатеричные цифры.Использование восьмеричного числа для 8-битных байтов требует трех восьмеричных цифр, из которых первая может иметь только значения 0, 1, 2 и 3 (первая цифра на самом деле является «четыречной», а не восьмеричной).Нет смысла переходить на base32, если только кто-нибудь не разработает систему, в которой длина байтов составляет десять бит, поэтому десятибитный байт можно представить как два 5-битных «ниббла».

«Новые» цифры должны были начинаться с цифры, чтобы соответствовать существующему синтаксису.

В сложившейся практике имена переменных и другие идентификаторы начинались с буквы (или нескольких других символов, например, подчеркивания или знака доллара).Итак, «a», «abc» и «a04» — это имена.Числа начинались с цифры.Итак, «3» и «3e5» — числа.

Когда вы добавляете что-то новое в язык программирования, вы стремитесь вписать их в существующий синтаксис, грамматику и семантику, а также пытаетесь заставить существующий код продолжать работать.Таким образом, вы не захотите менять синтаксис, чтобы сделать «x34» шестнадцатеричным числом или «o34» восьмеричным числом.

Итак, как вписать в этот синтаксис восьмеричные числа?Кто-то понял, что, кроме «0», цифры, начинающиеся с «0», не нужны.Никому не нужно писать «0123» вместо 123.Поэтому мы используем ведущий ноль для обозначения восьмеричных цифр.

А как насчет шестнадцатеричных цифр?Вы можете использовать суффикс, чтобы «34x» означало 34.16.Однако тогда анализатор должен прочитать число до конца, прежде чем он сможет интерпретировать цифры (если только он не встретит одну из цифр от «a» до «f», которая, конечно, будет обозначать шестнадцатеричное число).Парсеру «проще» заранее узнать, что число шестнадцатеричное.Но начинать все равно придется с цифры, а трюк с нулем уже использован, поэтому нам нужно что-то еще.Был выбран «x», и теперь у нас есть «0x» для шестнадцатеричного числа.

(Вышеизложенное основано на моем понимании синтаксического анализа и некоторой общей истории развития языка, а не на знании конкретных решений, принятых разработчиками компиляторов или языковыми комитетами.)

Я не знаю ...

0 означает 0ктал

0x означает, ну, мы уже использовали 0 для обозначения восьмеричного числа, а здесь есть x в шестнадцатеричном виде, так что заткните и его там тоже

что касается естественного развития, лучше всего обратить внимание на новейшие языки программирования, которые могут добавлять индексы, такие как

123_27 (интерпретируйте _ как нижний индекс)

и так далее

?

Отметка

Существует ли естественное развитие базы 32?

Это одна из причин, почему Ада использует форму 16# для введения шестнадцатеричных констант, 8# для восьмеричных, 2# для двоичных и т. д.

Однако я бы не слишком беспокоился о необходимости места для «будущего роста» базирования.Это не ОЗУ или адресное пространство, где с каждым поколением требуется на порядок больше.

Фактически, исследования показали, что восьмеричные и шестнадцатеричные числа в значительной степени являются сладкое пятно для удобочитаемых представлений, которые являются бинарно-совместимыми.Если вы пойдете ниже восьмеричного числа, для представления больших чисел начнет требоваться невероятное количество цифр.Если вы выберете значение выше шестнадцатеричного, математические таблицы станут невероятно большими.На самом деле Hex уже слишком много, но у Octal есть проблема: он неравномерно умещается в байт.

Существует стандартная кодировка База32.Это очень похоже на База64.Но читать не очень удобно.Шестнадцатеричный используется потому, что две шестнадцатеричные цифры могут использоваться для представления 1 8-битного байта.А восьмеричная система использовалась в основном для старых систем, в которых использовались 12-битный байты.Это позволило обеспечить более компактное представление данных по сравнению с отображением необработанных регистров в двоичном виде.

Следует также отметить, что в некоторых языках используется o### для восьмеричного числа и x## или h## для шестнадцатеричного, а также многие другие варианты.

Я думаю, что это 0x на самом деле он появился в мире UNIX/Linux и был подхвачен C/C++ и другими языками.Но я не знаю точной причины или истинного происхождения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top