¿Qué significa cuando una constante numérica en C / C ++ tiene el prefijo 0?

Ok … Entonces tuve una idea tonta e intenté poner el valor 0123 en una int, solo curiosidad por ver qué pasaría, asumí que cuando imprimiera el valor obtendría 123, pero en cambio obtuve 83 … ¿Alguna idea de por qué? ¿Qué sucede dentro del comstackdor / memoria que hace que este valor se convierta en 83?

Intenté esto en C ++ y C con el comstackdor de GCC y también intenté con un float que arrojó los mismos resultados.

En C / C ++, un literal numérico con el prefijo ‘0’ es octal (base 8).

Ver http://www.cplusplus.com/doc/tutorial/constants/

¡Felicidades! Has descubierto octal.

Esto se debe a que cualquier número que comience con 0 como este se considera en octal (base 8) no decimal.

Lo mismo si comienzas con 0x obtendrás hexadecimal

El 0 inicial indica un número “octal”. Entonces se convierte en 1 * 8 ^ 2 + 2 * 8 ^ 1 + 3 * 8 ^ 0 = 83

0123 es una constante octal (base 8). 83 es ​​el equivalente decimal.

0123 está en octal .

De acuerdo con el estándar de C ++ en [lex.icon] los literales enteros se pueden dividir en 3 tipos: literales decimales, literales octales y literales hexadecimales, cada uno de los cuales puede tener un sufijo para signes y tipo de longitud

Los literales decimales deben comenzar con un dígito diferente de cero, mientras que los literales octales comienzan con 0 y los literales hexadecimales tienen 0x y 0X, después del prefijo (para literales octales y literales hexadecimales) cualquier dígito que no sea representable en la base correspondiente debe desencadenar una comstackción error (como 09 que causa el error C2041: illegal digit '9' for base '8' y en otro comstackdor prog.cpp:6:15: error: invalid digit "9" in octal constant ), ya que si el entero es literal no representable, el progtwig se vuelve mal formado.