Was bedeutet es, wenn einer numerischen Konstante in C / C ++ eine 0 vorangestellt wird?

8

Ok ... Also hatte ich eine dumme Idee und versuchte, den Wert 0123 in einen Int zu setzen, nur neugierig, was passieren würde. Ich nahm an, dass ich 123 bekommen würde, wenn ich den Wert ausgedruckt habe, aber stattdessen 83 ... Irgendwelche Ideen warum? was passiert im Compiler / Speicher, der diesen Wert zu 83 macht?

Ich habe das in C ++ und C mit GCC-Compiler versucht und auch mit einem Float versucht, was zu den gleichen Ergebnissen führte.

    
CurtisJC 15.06.2011, 23:17
quelle

7 Antworten

16

In C / C ++ ist ein numerisches Literal mit dem Präfix "0" oktal (Basis 8).

Siehe Ссылка

    
Richard Schneider 15.06.2011, 23:19
quelle
3

Dies liegt daran, dass jede Zahl, die mit 0 beginnt, als oktal (Basis 8) und nicht als Dezimalzahl betrachtet wird.

Dasselbe gilt, wenn Sie mit 0x beginnen, erhalten Sie hexadezimal

    
Locksfree 15.06.2011 23:20
quelle
3

Die führende 0 zeigt eine "oktale" Zahl an. Also wird es 1 * 8 ^ 2 + 2 * 8 ^ 1 + 3 * 8 ^ 0 = 83

    
Bill Forster 15.06.2011 23:20
quelle
2

0123 ist eine Oktalkonstante (Basis 8). 83 ist das Dezimaläquivalent.

    
ribram 15.06.2011 23:19
quelle
1

0123 ist in oktal .

    
Bertrand Marron 15.06.2011 23:20
quelle
1

Nach dem C ++ - Standard in [lex.icon] können Integer-Literale in 3 Typen unterteilt werden: Dezimal-Literale, Oktal-Literale und Hexadezimal-Literale, von denen jedes ein Suffix für Signess und Länge haben kann Geben Sie

ein

Dezimal-Literale müssen mit einer Ziffer ungleich Null beginnen, während oktale Literale mit 0 beginnen und hexadezimale Literale 0x und 0X haben, nach dem Präfix (für Oktal-Literale und Hexadezimal-Literale) eine Ziffer nicht darstellbar in der entsprechenden Basis sollte einen Kompilierungsfehler auslösen (wie 09, die error C2041: illegal digit '9' for base '8' verursacht und in anderen Compiler prog.cpp:6:15: error: invalid digit "9" in octal constant ), da, wenn das Integer-Literal nicht darstellbar ist, das Programm schlecht gebildet wird.

    
lccarrasco 15.06.2011 23:56
quelle