Übertrag bei 32-Bit Addition

Gast #1744719
Lesenswert?

Karl heinz Buchegger schrieb:
> Wenn VC positiv ist und danach VA kleiner als VB ist, ist ein Übertrag
> entstanden.

1
unsigned long int VA, VB, VC;

Wie kann ich das testen ob Übertrag?
Kannst du coden?



MAXX schrieb:
>Oder den Datentyp ausreichend groß wählen, dass das 33. Bit (sonst im
>Carry) auch noch mit reinpasst.

Gibt es den einen Datentyp mit 40 Bit's?
Gast #1744751
Lesenswert?

Nein es braucht nur den einen Vergleich du kannst dich auch den unsigned 
Fall beschränken. (Addition von signed und unsigned sind äquivalent auf 
der bit-ebene)

Nach einem Überlauf ist das ergebnis immer kleiner als jeder der beiden 
summanden. Grenzfäll sind 1111...1111 und 0000...0001, welches 
0000....0000 nach Überlauf ergibt und dieses echt kleiner eines jeden 
der beiden Sumanden ist, bzw 1111...1111 + 1111...1111 ergibt nach 
Überlauf 1111...1110.

D.h. nur einer der summanden muss getestet werden. Ist das Ergebnis nach 
der Addition unter Modulo 2^n kleiner als dder erste Summand, so ist es 
auch kleiner als der zweite Summand.

Achja, ein (u)int40 ist nicht intern definiert. Ein (u)int64 sollte man 
aber immer hinbekommen.
Persönliche Seite #1744753
Lesenswert?

Kapitän Blaubär schrieb:

> Gibt's kein Assembler Template um das Carry-Flag anuzapfen?

Nein. Nicht so, daß es wasserdicht ist.

Wenn, dann musst du die ganze Addition in (Inline) Assembler ausführen.
Dann bist du aber darauf festgelegt, immer auf GPRs zu operieren, 
während der Compiler bei der Addition einer Konstanten diese direkt 
addieren kann. In dem Fall hast du also 4 Befehler zum Laden der 
Konstanten und 4 Befehle für die Addition zuzüglich Carry-Extraktion.

Sieht mir aber verdächtig nach Angst-Optimierung™ aus...
Persönliche Seite #1744755
Lesenswert?

Maxx schrieb:
> Nein es braucht nur den einen Vergleich du kannst dich auch den unsigned
> Fall beschränken. (Addition von signed und unsigned sind äquivalent auf
> der bit-ebene)

Nein, nicht wenn es um Überlauf-Erkennung/-Verarbeitung geht, wie man 
sie zB zur Saturierung braucht. Bei zwei 8-Bit Werten liefert zwar 
0xff+0xff=0xfe, aber eine signed-Addition läuft nicht über und bleibt im 
Wertebereich, während das für unsigned nicht der Fall ist.

Signed: -1+(-1)=-2 (ok)
Unsigned: 255+255=254 (nicht ok, und das will man erkennen)

Signed: 127 + 1 = -128 (nicht ok, will man erkennen)
Unsigned 127 + 1 = 128 (ok)
Gast #1744767
Lesenswert?

Johann L. schrieb:
> Nein, nicht wenn es um Überlauf-Erkennung/-Verarbeitung geht, wie man
> sie zB zur Saturierung braucht. Bei zwei 8-Bit Werten liefert zwar
> 0xff+0xff=0xfe, aber eine signed-Addition läuft nicht über und bleibt im
> Wertebereich, während das für unsigned nicht der Fall ist.

Auch in diesem Fall ist das Carry-Flag gesetzt.
Auf Bit Ebene sind beide additionen identisch.

Es gibt keine getrennten Opcodes für Signed und Unsigned Additionen in 
2er Komplement Systemen.
Persönliche Seite #1744776
Lesenswert?

Maxx schrieb:
> Johann L. schrieb:
>> Nein, nicht wenn es um Überlauf-Erkennung/-Verarbeitung geht, wie man
>> sie zB zur Saturierung braucht. Bei zwei 8-Bit Werten liefert zwar
>> 0xff+0xff=0xfe, aber eine signed-Addition läuft nicht über und bleibt im
>> Wertebereich, während das für unsigned nicht der Fall ist.
>
> Auch in diesem Fall ist das Carry-Flag gesetzt.
> Auf Bit Ebene sind beide additionen identisch.
>
> Es gibt keine getrennten Opcodes für Signed und Unsigned Additionen in
> 2er Komplement Systemen.

Sagte ich auch nicht, aber die Behandlung ist anders, um einen Überlauf 
zu erkennen. Wird das Carry nur verwendet, um eine breitere Arithmetik 
aufzubauen, ist's natürlich gehopst wie gehoppelt.

Siehe zB AVR Arithmetik/Saturierung wo das Carry-Flag alleine nicht 
ausreicht.

Ebenso werden bei einem Vergleich andere Flags abgetestet, abhängig 
davon, ob er signed oder unsigned ausgeführt wird, obwohl die 
Vergleichs-OP intern nur eine Subtraktion (ohne Rückschreiben des 
Ergebnisses) ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren