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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Как уже упоминалось, 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!

Ответ 3

ПРОСТОЙ

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

Пример:

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

Для Двоичного это будет

0b00000001

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

Добрый день,

Ответ 4

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

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

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

Добрый день!