printf avec “% d” de nombres commençant par 0 (ex “0102”) donnant une réponse inattendue (ex ‘“66”)

J’ai utilisé le code ci-dessous dans ma déclaration printf.

void main() { int n=0102; printf("%d", n); } 

Ceci affiche 66 comme réponse. J’ai également changé la valeur de la variable n en 012. Cela donne la réponse 10. Aidez-moi, s’il vous plaît, sur la façon dont cette conversion est effectuée.

    En effet, lorsque le premier chiffre d’un nombre (constante entière) est 0 (et que le second ne doit pas être x ou X ), le compilateur l’interprète comme un nombre octal. L’imprimer avec %d vous donnera une valeur décimale.
    Pour imprimer une valeur octale, utilisez %o

      printf("%o", n); 

    6.4.4.1 Constantes entières:

    1. Une constante entière commence par un chiffre, mais ne comporte aucune période ni partie d’exposant. Il peut avoir un préfixe qui spécifie sa base et un suffixe qui spécifie son type.

    2. Une constante décimale commence par un chiffre différent de zéro et consiste en une séquence de chiffres décimaux. Une constante octale est constituée du préfixe 0 éventuellement suivi d’une séquence des chiffres de 0 à 7 uniquement . Une constante hexadécimale est composée du préfixe 0x ou 0X suivi d’une séquence de chiffres décimaux et des lettres a (ou A) à f (ou F) avec les valeurs 10 à 15 respectivement.


    Constantes entières:

    1. Constantes décimales : ne doit pas commencer par 0 .

      12 125 3546 

    2. Constantes octales : Doit commencer par un 0 .

      012 0125 03546 

    3. Constantes hexadécimales : commence toujours par 0x ou 0X .

      0xf 0xff 0X5fff 

    Vous dites à printf d’imprimer la valeur en décimal (% d). Utilisez% o pour l’imprimer en octal.

    tout littéral numérique commençant par 0 suivi uniquement par des chiffres est considéré comme un nombre octal. Par conséquent

     0102 = (1 * 8^2) + (0 * 8^1) + (2 * 8^0) = 64 + 0 + 2 = 66 012 = (1 * 8^1) + (2 * 8^0) = 8 + 2 = 10