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? P>
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. P>
7 Réponses :
en C / C ++ un nombre littéral numérique avec un '0' est octal (base 8). p>
0123 est une constante octale (base 8). 83 est l'équivalent décimal. p>
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. code> DOH!
d'oh! a raison! Changé pour un meilleur ... merci!
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. P>
Même chose si vous commencez par 0x, vous obtiendrez hexadecimal p>
Le premier 0 indique un nombre "octal". Donc, il devient 1 * 8 ^ 2 + 2 * 8 ^ 1 + 3 * 8 ^ 0 = 83 P>
C'est un (code> 0 code> (zéro), pas un (code> (code> O code> (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é :-)
Selon la norme C ++ dans 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' code> et dans un autre compilateur
PROG.CPP: 6: 15: Erreur: chiffre non valide "9" en constante octale code>), car si le littéral entier n'est pas représentable, le programme devient mal formé. P>