В соответствии со стандартом C ++ в [lex.icon] целочисленные литералы можно разбить на 3 типа: десятичные литералы, восьмеричные литералы и шестнадцатеричные литералы, каждый из которых может иметь суффикс для типа знака и длины
Десятичные литералы должны начинаться с ненулевой цифры, тогда как восьмеричные литералы начинаются с 0, а шестнадцатеричные литералы имеют 0x и 0X, после префикса (для восьмеричных литералов и шестнадцатеричных литералов) любая цифра, которая не является представимость в соответствующей базе должна вызывать ошибку компиляции (например, 09, которая вызывает error C2041: illegal digit '9' for base '8'
, а в другом компиляторе prog.cpp:6:15: error: invalid digit "9" in octal constant
), поскольку, если целочисленный литерал не представим, программа становится плохо сформированной.