Примечание: я не знаю правильного ответа, но нижеприведенное - всего лишь мое личное предположение!
Как уже упоминалось, 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!