Почему шестнадцатеричные числа начинаются с префикса 0x
? Я понимаю использование префикса, но не понимаю, почему 0x
был выбран.
Почему шестнадцатеричные числа начинаются с префикса 0x
? Я понимаю использование префикса, но не понимаю, почему 0x
был выбран.
Ответы:
Короткая история: The 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 # является потомком C, поэтому он наследует синтаксис.
0x
над 00
было предпочтение / неловкости. 00
сломал бы существующий код. 0010
как восьмеричный 8
, тогда 0010
как шестнадцатеричный 16
. Они не могли использовать любое число в качестве индикатора второй цифры (кроме 8
или 9
, и ни одно из них не имеет никакого значения, связанного с шестнадцатеричной), поэтому буква обязательна. И это оставляет либо 0h
или 0x
( H e X idecimal). С этого момента кажется, что он действительно вернулся к предпочтениям.
0
префикса для восьмеричного кода на протяжении многих лет вызывало очень много проблем. Особенно в таких странах, как Великобритания, где номера телефонов начинаются с 0
. Javascript и многие другие языки будут анализировать их как восьмеричные, искажая число перед сохранением. Чтобы добавить к веселью, один популярный продукт базы данных будет молча переключаться обратно на десятичный анализ, если число содержит 8
или 9
.
Примечание: я не знаю правильного ответа, но ниже приведены только мои личные предположения!
Как уже упоминалось, 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!
0xFFAB1234
должно быть написано как 0FFAB1234h
. Я помню это из встроенного ассама в Паскале, когда я был молодым stackoverflow.com/q/11733731/995714
Это префикс, указывающий, что число указано в шестнадцатеричном формате, а не в какой-либо другой базе. Язык программирования C использует его, чтобы сообщить компилятору.
Пример:
0x6400
переводит на 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
Когда чтение компилятора 0x6400
, он понимает, что число является шестнадцатеричным с помощью 0x термин. Обычно мы можем понять по (6400) 16 или (6400) 8 или как угодно ..
Для двоичного файла это будет:
0b00000001
Надеюсь, я помог каким-то образом.
Добрый день!
x6400
? Это x
все еще может быть использовано для вывода шестнадцатеричного.
Предыдущий 0 используется для обозначения числа в базе 2, 8 или 16.
На мой взгляд, 0x было выбрано для обозначения гекса, потому что «х» звучит как гекс.
Просто мое мнение, но я думаю, что это имеет смысл.
Хорошего дня!