Что это означает, когда числовая константа в C / C ++ имеет префикс 0? - PullRequest
8 голосов
/ 16 июня 2011

Хорошо ... Итак, у меня возникла глупая идея, и я попытался поместить значение 0123 в целое число, просто любопытно посмотреть, что произойдет, я предполагал, что при печати значения я получу 123, но вместо этого я получил 83 ... есть идеи почему? что происходит внутри компилятора / памяти, в результате чего это значение становится 83?

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

Ответы [ 7 ]

16 голосов
/ 16 июня 2011

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

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

8 голосов
/ 16 июня 2011
3 голосов
/ 16 июня 2011

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

3 голосов
/ 16 июня 2011

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

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

2 голосов
/ 16 июня 2011

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

1 голос
/ 16 июня 2011

В соответствии со стандартом 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), поскольку, если целочисленный литерал не представим, программа становится плохо сформированной.

1 голос
/ 16 июня 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...