2015-05-26 18 views
15

Kann mir jemand helfen, in den Standards (C99 und C++ 03) zu erkennen, was mit der Zeile darunter passiert?C/C++ Literale

uint16_t a = 5; 

Also, auf der linken Seite ist die eingegebene Variable, auf der rechten Seite die wörtliche ist, wann und wie sich die wörtliche Wert den Typ der Variablen bekommen?

Ist die obige Zuordnung äquivalent zur folgenden Aussage?

uint16_t a = (uint16_t)5; /* C */ 
uint16_t a = reinterpret_cast<uint16_t>(5); // C++ 

Wie wäre:

uint16_t a = 5u; 

Dann, wenn Sie so etwas wie haben:

uint32_t b = a + 5; 

Ist die Aussage über das entspricht Erklärung unten?

uint32_t b = (uint32_t)(a + (uint16_t)(5)); /* C */ 
uint32_t b = reinterpret_cast<uint32_t>(a + reinterpret_cast<uint16_t>(5)); // C++ 

Ändern sich die Dinge in C11 und C++ 14? Nehmen Sie außerdem an, dass das System int 32 Bit ist.

Ich habe schon eine Weile in C programmiert, habe es aber nie richtig verstanden, aber es stört mich immer, also würde ich mich freuen, wenn mir jemand helfen kann, es zu klären.

Danke ...

(Herausgegeben: added Annahme, dass der int 32 Bit)

+6

Nun endlich haben wir eine Frage markiert sowohl C und C++ und es ist ** tatsächlich ** bezogen auf beide :) – Eregrith

+4

Das wäre 'static_cast' nicht' reininterpret_cast' (das ist nur für Konvertierungen mit Zeigern und Referenzen). –

+0

'5' ist vom Typ' int' und '5u' ist vom Typ' unsigned int'. – user3528438

Antwort

6

Die Regel ist, dass zuerst die RHS ausgewertet wird, und dann wird der Wert für den Zieltyp umgewandelt. Insbesondere ist

uint32_t b = a + 5; 

entspricht

uint32_t b = (uint32_t)((int)a + 5); 

uint16_t Wenn ein schmaler Typ ist, schmaler als int.

Alle Operationen in C (und ich denke auch in C++) sind mindestens in einem ganzzahligen Rang von int.

+0

Ist 'uint32_t a = 1.8 + 0.3;' auch ein gutes Beispiel? (Da Fließkommazahlen * beim Konvertieren in einen Integer-Typ * abgeschnitten werden, zeigt das Ergebnis '2', dass die Werte * vor der Konvertierung * addiert werden.) – usr2564301

+0

"Rang von int". Bytes sind was wirklich zählt imo. – Malina

+0

@Jongware, sicher, gutes Beispiel. Zuerst wird der Ausdruck auf der rechten Seite als "double" ausgewertet und dann in "uint32_t" konvertiert –