www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Übertrag bei 32-Bit Addition


Autor: Kapitän Blaubär (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich addiere zwei 32-Bit Zahlen.
VA = VB + VC;
Wie bekomme ich in C (GCC WinAVR) mit ob ein Übertrag erfolgt ist?
Wie kann ich das Carry-flag anzapfen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kapitän Blaubär schrieb:
> Ich addiere zwei 32-Bit Zahlen.
>
> VA = VB + VC;
> 
> Wie bekomme ich in C (GCC WinAVR) mit ob ein Übertrag erfolgt ist?

Wenn VC positiv ist und danach VA kleiner als VB ist, ist ein Übertrag 
entstanden.

> Wie kann ich das Carry-flag anzapfen?

Gar nicht.

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder den Datentyp ausreichend groß wählen, dass das 33. Bit (sonst im 
Carry) auch noch mit reinpasst.

Autor: Kapitän Blaubär (Gast)
Datum:

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

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?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
carry = 0;
a = b + c;
if (a < b) // oder a < c
   carry = 1;

Für signed-Werte ist das aber nicht mehr so einfach.

Autor: Kapitän Blaubär (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> carry = 0;
> a = b + c;
> if (a < b) // oder a < c
>    carry = 1;

Ich denke, beide Vergleiche sind nötig:
if ((a<b)||(a<c)) carry = 1;

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kapitän Blaubär schrieb:
> Ich denke, beide Vergleiche sind nötig:

Nein. Oder schaffst du es, ein Beispiel zu konstruieren, wo nach dem 
Überlauf a zwischen b und c liegt?

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wir suchen den Übertrag nicht den Überlauf.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.