Почему шестнадцатеричные числа имеют префикс 0x?

почему шестнадцатеричные числа имеют префикс 0x? Я понимаю использование префикса, но я не понимаю значения why .

4 ответов


краткий сюжет: на 0 сообщает синтаксическому анализатору, что он имеет дело с константой (а не с идентификатором/зарезервированным словом). Что-то еще нужно, чтобы указать базу чисел:x - это произвольный выбор.

долгая история: в 60-х годах преобладающими системами программирования были decimal и восьмеричной - мэйнфреймы имели 12, 24 или 36 бит на байт, что хорошо делится на 3 = log2(8).

язык BCPL используется синтаксис 8 1234 для восьмеричных чисел. Когда Кен Томпсон создал B из BCPL, он использовал 0 префикс вместо этого. Это здорово, потому что

  1. целочисленная константа теперь всегда состоит из одной лексемы,
  2. парсер все еще может сразу сказать, что у него есть константа,
  3. парсер может сразу сказать базе (0 одинаково в обеих базах),
  4. это математически вменяемый (00005 == 05), и
  5. не тужься необходимы специальные символы (как в #123).

Когда C был создан из B, возникла необходимость в шестнадцатеричных числах (PDP-11 имел 16-битные слова), и все вышеперечисленные точки были по-прежнему действительны. Поскольку окталы все еще были нужны для других машин,0x был произвольно выбран (00, вероятно, был исключен как неудобный).

C# является потомком C, поэтому он наследует синтаксис.


примечание: Я не знаю правильного ответа, но ниже-это только мои личные домыслы!

как уже упоминалось, 0 перед числом означает, что оно восьмеричное:

04524 // octal, leading 0

представьте, что вам нужно придумать систему для обозначения шестнадцатеричных чисел, и обратите внимание, что мы работаем в среде стиля C. Как насчет окончания сборки h like? К сожалению, вы не можете - это позволит вам сделать токены, которые являются действительными идентификаторами (например. можно назвать переменную то же самое), что сделало бы некоторые неприятные двусмысленности.

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

вы не можете привести с персонажем по той же причине:

xFF00 // also valid identifier

использование хэша, вероятно, было выброшено, потому что он конфликтует с препроцессором:

#define ...
#FF00 // invalid preprocessor token?

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

0xFF00 // definitely not an identifier!

простой

это префикс, указывающий, что число находится в шестнадцатеричном, а не в какой-либо другой базе. Язык программирования C использует его для передачи компилятору.

пример :

0x6400 переводится как 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. Когда компилятор читает 0x6400, Он понимает, что число шестнадцатерично с помощью 0x термин. Обычно мы можем понять (6400)16 или (6400)8 или что ..

на Бинарные будет

0b00000001

Надежда каким-то образом помогла.

Добрый день,


предыдущий 0 используется для указания числа в базе 2, 8 или 16.

на мой взгляд, 0x был выбран для обозначения hex, потому что " x " звучит как hex.

только мое мнение, но я думаю, что это имеет смысл.

Добрый День!