Frage

Ich habe einige Tests in VC++2010 durchgeführt, bei denen Operanden unterschiedlicher Größe gemischt wurden, die einen Überlauf beim Additionsvorgang verursachen:

int _tmain(int argc, _TCHAR* argv[])
{
    __int8 a=127;
    __int8 b=1;
    __int16 c=b+a;
    __int8  d=b+a;
    printf("c=%d,d=%d\n",c,d);

    return 0;
}

//result is: c=128, d=-128

Ich verstehe nicht, warum c==128!Meines Wissens nach gelten in beiden Additionen b+a immer noch als Addition von 2 mit Vorzeichen 8 Bit Variablen.Das Ergebnis ist also ein Überlauf, d.h.-128. Danach, wird das Ergebnis dann für die erste Zuweisungsoperation auf ein 16-Bit-Signed-Int heraufgestuft und c sollte immer noch einen 16-Bit-Wert von -128 erhalten.Ist mein Verständnis richtig?Der C++-Standard ist etwas schwer zu lesen.In Kapitel 4 geht es anscheinend um ganzzahlige Werbung, aber ich kann nichts zu diesem speziellen Beispiel finden.

War es hilfreich?

Lösung

Meines Wissens nach gelten in beiden Additionen b+a immer noch als Addition von 2 vorzeichenbehafteten 8-Bit-Variablen.Das Ergebnis ist also ein Überlauf, d.h.-128.

Nein, die Aktion findet vor dem statt + ausgewertet wird, nicht danach.Die Addition erfolgt, wenn beide a Und b sind positiv.Beide Nummern werden hochgestuft ints für eine Addition, die als zwei positive Zahlen addiert und dann in einen 16-Bit-Kurzschluss umgewandelt wird.Zu keinem Zeitpunkt des Prozesses wird das Ergebnis aufgrund eines Überlaufs negativ, daher das Endergebnis 128.

Das macht wohl Sinn:das Verhalten von a Und b entspricht dem zweier Zahlen in der Mathematik, was es für Sprachpraktiker intuitiver macht.

Andere Tipps

Es ist ganzheitliche Werbung.

1 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.[§ 4.5]

In dieser Aussage

 __int16 c=b+a;

Zuerst alle char Und short int Werte werden automatisch auf erhöht int.Dieser Vorgang wird aufgerufen Ganzheitliche Förderung.Anschließend werden alle Operanden auf den Typ des größten aufgerufenen Operanden umgerechnet Typförderung.[Herbert Schildt]

Der Werte von Variablen b Und a wird befördert int und dann wird die Operation auf sie angewendet.

Bei der Zweierkomplement-Ganzzahldarstellung wird ein vorzeichenbehafteter Wert durch Setzen des höchsten Bits dargestellt.Dadurch kann die Maschine binäre Ganzzahlen mit denselben Anweisungen addieren und subtrahieren, unabhängig davon, ob die Ganzzahl ein Vorzeichen hat.

  a = 127 == 0x7F == 0b01111111
+ b =   1 == 0x01 == 0b00000001
-------------------------------
  c = 128 == 0x80 == 0b10000000
  d =-128 == 0x80 == 0b10000000

Die Variablen c Und d können unterschiedliche Typen haben, aber unterschiedliche Arten von Ganzzahlen sind lediglich unterschiedliche Interpretationen eines einzelnen Binärwerts.Wie Sie oben sehen können, passt der Binärwert problemlos in 8 Bit.Da der Standard erfordert, dass Terme eines mathematischen Ausdrucks durch Nullen oder Vorzeichen auf die Größe eines Maschinenworts erweitert (heraufgestuft) werden Vor Jede Berechnung ist abgeschlossen und keiner der Operanden wird vorzeichenerweitert, das Ergebnis ist immer 0b10000000 egal, um welchen Typ es sich bei den Operanden handelt.

Zusammenfassend besteht der Unterschied zwischen den Ergebnissen darin, dass bei einer 16-Bit-Ganzzahl das Vorzeichenbit gleich ist 0b1000000000000000 (welche a+b nicht hat), und zu einer 8-Bit-Ganzzahl ist das Vorzeichenbit 0b10000000 (welche a+b hat).

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