Почему шестнадцатеричные числа с префиксом 0x? - PullRequest
371 голосов
/ 20 апреля 2010

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

Ответы [ 4 ]

393 голосов
/ 03 января 2011

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

Длинная история: В 60-х годах преобладающие числовые системы программирования были десятичными и восьмеричными - мэйнфреймы имели 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, поэтому он наследует синтаксис.

91 голосов
/ 20 апреля 2010

Примечание: я не знаю правильного ответа, но ниже приведены только мои личные предположения!

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

04524 // octal, leading 0

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

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!
21 голосов
/ 05 июня 2015

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

Пример:

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

Для двоичный это будет:

0b00000001

Надеюсь, я чем-то помог.

Добрый день!

8 голосов
/ 27 апреля 2017

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

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

Просто мое мнение, но я думаю, что оно имеет смысл.

Добрый день!

...