Frage

Mögliches Duplikat:
Das Hinzufügen von zwei Zeichen erzeugt int

Angesichts des folgenden C ++ - Codes:

unsigned char a = 200;
unsigned char b = 100;

unsigned char c = (a + b) / 2;

Die Ausgabe ist 150 as logisch erwartet, sollte es jedoch keinen ganzzahligen Überlauf im Ausdruck geben (a + b)?

Offensichtlich muss es hier eine ganzzahlige Beförderung geben, um mit dem Überlauf fertig zu werden, oder es passiert etwas anderes, das ich nicht sehen kann.Ich habe mich gefragt, ob mich jemand aufklären könnte, damit ich weiß, worauf ich mich in Bezug auf ganzzahlige Werbung und Überlauf verlassen kann und worauf ich mich nicht verlassen sollte.

War es hilfreich?

Lösung

Weder C ++ noch C führen arithmetische Berechnungen mit "kleineren" Integer-Typen wie durch, char und short.Diese Typen werden fast immer befördert zu int bevor weitere Berechnungen beginnen.Ihr Ausdruck wird also wirklich als bewertet

unsigned char c = ((int) a + (int) b) / 2;

PS.Auf einer exotischen Plattform, auf der die Reichweite von int deckt nicht den Bereich von ab unsigned char, Art unsigned int wird als Zieltyp für die Werbung verwendet.

Andere Tipps

Nein, das ist kein Fehler.

Der Compiler berechnet immer mit minimaler ganzzahliger Genauigkeit, das Ergebnis wird nur bei Zuweisung wieder in vorzeichenloses Zeichen konvertiert.

Dies ist im Standard.

Bei anderen Antworten handelt es sich nicht um einen Fehler auf x86 und anderen (vernünftigen) 32-Bit- und 16-Bit-Architekturen.

Auf kleineren oder weniger vernünftigen Architekturen (normalerweise sehr kleinen Mikrocontrollern) werden solche Dinge jedoch wahrscheinlich zu Problemen führen, insbesondere wenn derjenige, der Ihren Compiler implementiert hat, nicht über das Test- / Validierungsbudget einiger der größeren Unternehmen verfügt (wieder) Mikrocontroller).

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