2016-04-27 10 views
1

MSDN https://msdn.microsoft.com/en-us/library/69ze775t.aspx beschrieben VS Zeichenliteral wie folgt:VS2013 Zeichenliteral funktioniert nicht als MSDN Spezifikation

mehrere Zeichen in dem literalen fill nach Bedarf entsprechendes Bytes von Hoch> um niedrige Ordnung. Um einen char-Wert zu erstellen, verwendet der Compiler das niederwertige Byte.

Nach dem Dokument sollte das folgende Ergebnis sein, was ich will.

Wenn jedoch Escape-Sequenzen erscheinen, haben sich die Dinge geändert, hier ist das Ergebnis, das ich auf meinem PC gemacht habe.

unsigned int i = '1234'; // i = 0x34333231 
unsigned int j = '\1\2\3\4\'; // j = 0x01020304 <- ??????? 

Moment mal, was ist hier gerade passiert? Ich freue mich auf diese Variante j ist 0x04030201. Wo ist das High-Order-Low-Order-Ding? Ich kann es nicht alleine herausfinden.

Dies sollte meine erste Frage sein. Warum füllt der Compiler nicht den Speicher von hoher Ordnung bis zu niedriger Ordnung, wenn oktale Fluchten auftreten?

es ist noch nicht die ganze Geschichte, werde ich etwas interessanter hier zeigen

unsigned int k = '0\101\1001'; // k = 0x31403041 memory[low->high] [0x41 0x30 0x40 0x31] ??what the hell 
unsigned int l = '0\1011\100'; // l = 0x40304131 memory[low->high] [0x31 0x41 0x30 0x40] ??what the hell again 

Bisher bin ich total verloren. Ich kann aus diesen Testfällen nicht einmal eine einfache Regel ableiten.

Weiß niemand etwas über dieses Problem? Vielen Dank.

Antwort

0

Ich sehe hier keinen Widerspruch. Wenn Sie Zeichenliterale verwenden, um Werte int Typen zuzuweisen, werden sie auf die gleiche Weise behandelt wie die Zuweisung an wchar_t. Der einzige Unterschied ist, int belegt vier Bytes und wchar_t hat zwei Bytes (typischerweise). Siehe das folgende Beispiel in der documentation page:

wchar_t w1 = L'\100'; // L'@' 
wchar_t w2 = L'\1000'; // C4066 L'@', 0 ignored 
wchar_t w3 = L'\009'; // C4066 L'\0', 9 ignored 
wchar_t w4 = L'\089'; // C4066 L'\0', 89 ignored 
wchar_t w5 = L'\qrs'; // C4129, C4066 L'q' escape, rs ignored 
wchar_t w6 = L'\x0050'; // L'P' 
wchar_t w7 = L'\x0pqr'; // C4066 L'\0', pqr ignored 
+0

Danke dafür. Aber das will ich nicht. Ich weiß, dass int vier Bytes und wchar_t zwei Bytes hat, aber ich muss wissen, wenn ich '0 \ 101 \ 1001' schreibe, wie ist es im Speicher. Es scheint, dass VS2013 [0x41, 0x30, 0x40, 0x31] in den Speicher von Low-Adresse zu High-Adresse setzen wird, was nicht dasselbe ist wie die MSDN beschreibt. – nir

+0

Es ist eine Weile her. Aber ich lese gerade [diese gute Antwort] (http://stackoverflow.com/a/10220539/5358284) und erinnerte mich an deine Frage. Nur für den Fall –