Unterschied Carry und Overflow Flag

yxy

Lieutenant
Registriert
Juli 2014
Beiträge
570
Hallo,

mir ist noch nicht ganz klar was der Unterschied zwischen diesen beiden Flags ist.
Im Netz findet man dazu ganz verschiedenen Ausssagen:

z.B.
ganz einfach: das overflow-flag zeigt an, dass der zahlenbereich überschritten wurde - beispielsweise beim bitweisen hochzählen von 0xFF auf 0x00. das ist eigentlich eher ein hinweisflag. das carry-flag steht für den übertrag - beispielsweise bei einer addition.

Aber wenn ich doch einen Übertrag habe, dann wurde auch der Zahlenbereich überschritten, oder?

In Wiki steht, dass das Carry Flag etwas mit unsigned und das Overflow Flag etwas mit signed Zahlen zu tun haben soll.


Irgendwie ist mir das noch nicht ganz klar.
Kennt sich jemand von euch damit aus?
 
Aus einem Übertrag (Carry) des letzten Bits folgt direkt ein Überlauf (Overflow), allerdings kann auch ein Überlauf vorliegen, obwohl es kein Übertrag beim letzten Bit gab.
Wenn du vorzeichenlos addierst und es zu einem Carry (beim letzten Bit) kommt, dann (und nur dann) liegt ein Overflow vor. Die beiden Flags sagen also das gleiche aus.
Wenn du allerdings vorzeichenbehaftete Zahlen hast, ist die Sache etwas schwieriger. Die werden nämlich in der Regel im Zweierkomplement gespeichert. Wenn du 4-Bit-Daten hast und auf die dezimale 7 (binär 0111) eins draufaddierst, dann erhältst du binär 1000, was im Zweierkomplement der Repräsentation der dezimalen -8 entspricht. Es liegt also ein Overflow vor, obwohl es kein Carry beim letzten Bit gab.
 
Grob gesagt, #CF wird gesetzt wenn es zu einem Übertrag über das höchste Bit kommt, #OV bei einem Übertrag in das höchste - also bei signed in das Vorzeichenbit.
Rechnest Du mit unsigned ist #CF zu beachten, bei signed eben #OV. (Anm.: Je nach CPU zusätzlich zu #CF oder stattdessen,)

Bei angenommenen 4 bit Registern:
0100 + 0100 = 1000
#CF nicht gesetzt da kein Übertrag über das höchste und in ein (gedachtes) 5. bit.
#OV gesetzt da Übertrag in das höchste.

Bei signed wäre das Ergebnis falsch, bei unsigned korrekt.
 
Zurück
Oben