8
votes

Qu'est-ce que cela signifie quand une constante numérique en C / C ++ est préfixée avec un 0?

OK ... J'ai donc eu une idée idiote et j'ai essayé de mettre la valeur 0123 dans un int, juste curieux de voir ce qui se passerait, j'ai supposé que lorsque j'ai imprimé la valeur que j'aurais 123, mais j'ai eu 83 ... des idées pourquoi? Que se passe-t-il à l'intérieur du compilateur / de la mémoire qui rend cette valeur 83?

J'ai essayé ceci en C ++ et C avec le compilateur GCC et j'ai également essayé avec un flotteur qui a donné les mêmes résultats.


0 commentaires

7 Réponses :


17
votes

en C / C ++ un nombre littéral numérique avec un '0' est octal (base 8).

voir http://www.cplusplus.com/doc/Tutorial/Constants/


0 commentaires

2
votes

0123 est une constante octale (base 8). 83 est l'équivalent décimal.


0 commentaires

8
votes

3 commentaires

L'amusement est meilleur que la perforation. :-)


Pour écrire des numéros en octale, précéder la valeur avec un 0. ... Pour écrire des nombres en octale, précéder la valeur avec un 0x ou 0x. DOH!


d'oh! a raison! Changé pour un meilleur ... merci!



1
votes

0123 est dans octal .


0 commentaires

3
votes

Ceci est parce que tout numéro commençant par 0 comme celui-ci est considéré comme étant en octale (base 8) non décimale.

Même chose si vous commencez par 0x, vous obtiendrez hexadecimal


0 commentaires

3
votes

Le premier 0 indique un nombre "octal". Donc, il devient 1 * 8 ^ 2 + 2 * 8 ^ 1 + 3 * 8 ^ 0 = 83


2 commentaires

C'est un (code> 0 (zéro), pas un (code> (code> O (O).


Bien sûr, vous êtes tout à fait correct, je viens de réaliser mon erreur et est revenu pour éditer. Tenté de me donner un -1 pour la stupidité :-)



1
votes

Selon la norme C ++ dans [lex.icon] Les littéraux entier peuvent être divisés en 3 types: littéraux décimaux, littéraux octals et littéraux hexadécimaux, chacun peut avoir un suffixe pour la signature et la longueur Tapez

littéraux décimaux doit commencer par un chiffre non zéro, tandis que les littéraux octals commencent par 0 et les littéraux hexadécimaux ont 0x et 0x, après le préfixe (pour les littéraux octels et les littéraux hexadécimaux). Non représentable dans la base correspondante doit déclencher une erreur de compilation (telle que 09 qui provoque une erreur C2041: un chiffre illégal '9' pour la base '8' et dans un autre compilateur PROG.CPP: 6: 15: Erreur: chiffre non valide "9" en constante octale ), car si le littéral entier n'est pas représentable, le programme devient mal formé.


0 commentaires