2017-09-09 3 views
0

Ich habe folgende Frage: z. Ich habe Code gegeben:Wann passiert Typ Umwandlung in C

uint8_t a = 0x30; 
uint16_t b = a << 8; 

Wird a sein erstes verschoben und dann umgewandelt uint16_t? Oder wird es zuerst in uint16_t umgewandelt? Oder ist dieser Verhaltenscompiler abhängig? Ich versuche, ein uint16_t gegebenen LSB und MSB separat als uint8_t s zu bauen.

P.S. Ich wusste nicht, dass dieses Verhalten davon abhängt, ob es C oder C++ ist. Könnte jemand bitte erzählen, wie es in beiden Fällen funktioniert?

+1

C! = C++. Entscheiden Sie zuerst, welche Sprache Sie tatsächlich verwenden und markieren Sie * nur * diese Sprache. – tambre

+2

C oder C++? Sie sind zwei sehr verschiedene Sprachen, besonders wenn es um Semantik geht. –

+1

hängt dieses Verhalten davon ab, ob es c oder C++ ist –

Antwort

4

Ausdruck Auswertung in C ist unten im Ausdrucksbaum, das ist in Ihrem Fall a << 8 wird zuerst ausgewertet (offensichtlich) vor der Verwendung als Initialisierer. Das Typsystem von C folgt dieser Bewertung, aber siehe unten, so dass der Typ auf der rechten Seite des = nichts mit dem Typ auf der linken Seite zu tun hat. Nur für die Initialisierung wird der Typ selbst mit einer impliziten Konvertierung angepasst.

Das heißt, die Dinge mehr für a << 8 hier kompliziert, als sie auf den ersten Blick aussehen, weil Sie einen Typ für a gewählt, die (wahrscheinlich) eine schmalen Typ ist. Also auf den meisten Architekturen uint8_t, wie es schmaler ist als int wird in jedem arithmetischen Ausdruck zu diesem befördert werden.

Also hier in Ihrem Fall, dass Sie eine int geben würde, so dass die Verschiebung nach links mit 8 funktioniert gut, und dann wird die int zu uint16_t umgewandelt.

Hätten Sie eine Konstante für a mit HO Bit 1 gewählt, wäre das Bild anders. Abhängig von der Architektur (wenn int 16 Bit ist), könnte dies dann ein 1 in das Vorzeichenbit verschieben und das Verhalten wäre undefiniert.

Alle diese komplizierten Argumente zeigen, dass es im Allgemeinen keine gute Idee ist, Arithmetik mit schmalen Integer-Typen zu machen.

+0

Also in jeder arithmetischen Operation, wo Operand schmaler ist als int, wird es vor der Operation zu int hochgestuft? –

+0

und was würde passieren, wenn int 16 Bits und a war 0xF0? An welchem ​​Punkt würde es schiefgehen? –

+0

Die linke Verschiebung würde eine 1 in das Vorzeichenbit verschieben, was nicht erlaubt ist. –