Что означает, когда числовая константа в C/C++ имеет префикс 0?

Ok... Поэтому у меня возникла глупая идея и я попытался поместить значение 0123 в int, просто любопытно посмотреть, что произойдет, я предположил, что когда я напечатаю значение, я получу 123, но вместо этого я получил 83... Есть идеи почему? что происходит внутри компилятора / памяти, что делает это значение 83?

Я попробовал это в C++ и C с компилятором GCC, а также попытался с float, который дал те же результаты.

7 ответов


в C/C++ числовой литерал с префиксом " 0 " является восьмеричным (база 8).

см.http://www.cplusplus.com/doc/tutorial/constants/



Это потому, что любое число, начинающееся с 0, как это считается в восьмеричном (база 8) не десятичный.

то же самое, если вы начнете с 0x вы получите шестнадцатеричное


ведущее 0 указывает на "восьмеричное" число. Так он становится 1*8^2 + 2*8^1 + 3*8^0 = 83


0123-восьмеричная константа (основание 8). 83-десятичный эквивалент.


0123 находится в восьмеричной.


согласно стандарту C++ в [Лекс.icon] целочисленные литералы можно разделить на 3 типа: десятичные литералы, восьмеричные литералы и шестнадцатеричные литералы, каждый из которых может иметь суффикс для signess и length type

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