14 Stimmen

Warum bekomme ich keinen Integer-Überlauf, wenn ich zwei Zeichen addiere?

Mögliches Duplikat:
Addition von zwei Zeichen ergibt int

Gegeben sei der folgende C++-Code:

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

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

Die Ausgabe ist 150 als logischerweise erwartet, aber sollte es nicht zu einem Integer-Überlauf in dem Ausdruck (a + b) ?

Offensichtlich muss es eine Integer-Promotion geben, um den Überlauf hier zu behandeln, oder es passiert etwas anderes, das ich nicht sehen kann. Ich frage mich, ob mich jemand aufklären kann, damit ich weiß, worauf ich mich in Bezug auf die Integer-Promotion und den Überlauf verlassen kann und nicht sollte.

13voto

AnT Punkte 300728

Weder C++ noch C führen arithmetische Berechnungen mit "kleineren" ganzzahligen Typen wie, char y short . Diese Typen werden fast immer befördert zu int bevor weitere Berechnungen beginnen. Ihr Ausdruck wird also wirklich wie folgt ausgewertet

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

P.S. Auf irgendeiner exotischen Plattform, auf der die Reichweite von int deckt nicht den Bereich der unsigned char der Typ unsigned int wird als Zielart für die Förderung verwendet.

7voto

sehe Punkte 346808

Nein, dies ist kein Fehler.

Der Compiler rechnet immer mit einem Minimum an Integer-Präzision, das Ergebnis wird nur bei der Zuweisung in unsigned char zurückgewandelt.

Dies steht in der Norm.

0voto

Ben Burns Punkte 14557

Laut anderen Antworten ist es kein Fehler auf x86 und anderen (vernünftigen) 32bit- und 16bit-Architekturen .

Auf kleineren oder weniger vernünftigen Architekturen (typischerweise 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 (wiederum Mikrocontroller).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X