Frage

Das ist eine sehr einfache Frage.Mir ist aufgefallen, dass Folgendes beim Kompilieren in MSVS2012 Folgendes erzeugt: erwartet Ergebnis von 0x3412 für val:

unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);

Eigentlich hätte ich den dereferenzierten char-Zeiger erwartet *(ch+1) auf der rechten Seite, um a zu produzieren verkohlen Wert von 0x34, die dann um 8 Bit nach links verschoben würde, was erzeugt würde 0x00.Es scheint, dass der Wert zum Zeitpunkt der Dereferenzierung bereits in einem Typ gespeichert ist, der groß genug ist, um mindestens zwei Bytes zu enthalten.

Ist dies in der angegeben C++ Standard irgendwo?Wie genau geschieht diese implizite Besetzung?

War es hilfreich?

Lösung

Dies fällt unter die Entwurf eines C++-Standards Abschnitt 5.8 Schichtoperatoren Absatz 1 was sagt:

[...]Die Operanden müssen vom Typ einer ganzzahligen Aufzählung oder einer Aufzählung ohne Gültigkeitsbereich sein und es werden ganzzahlige Heraufstufungen durchgeführt.[...]

Und integrale Werbeaktionen werden im Abschnitt behandelt 4.5 Integrale Werbeaktionen was im Absatz 1 sagt:

Ein Wert eines ganzzahligen Typs außer bool, char16_t, char32_t oder wchar_t, dessen Ganzzahlkonvertierungsrang (4.13) kleiner als der Rang von int ist, kann in einen Wert vom Typ int konvertiert werden, wenn int alle Werte des Quelltyps darstellen kann ;Andernfalls kann der Quellwert in einen Wert vom Typ „unsigned int“ konvertiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top