Unterschied zwischen Carry und Overflow

Im Fach Microcontrollertechnik beschäftigen wir uns zur Zeit mit der Programmierung in Assembler. Sind aber noch bei den Anfängen.
Von unserer Seite kommt häufig die Frage auf, was denn der Unterschied zwischen Carry und Overflow sei.
Unser Dozent macht es meistens kurz und knapp, so dass keiner was versteht.
Herausgefunden haben wir inzwischen, dass es irgendetwas mit dem Darstellungsbereich zu tun haben muss.
So kann z.B. ein 8Bit-Register Zahlen von 0 bis 255 darstellen, aber auch -128 bis 127.

Was ist denn nun genau der Unterschied zwischen einem Carry und einem Overflow?

MfG
Blacky

Hallo,

schau mal hier: http://en.wikipedia.org/wiki/Carry_flag

Vielleicht hilft Dir das ja weiter :wink:

Gruss
Petra

So kann z.B. ein 8Bit-Register Zahlen von 0 bis 255
darstellen, aber auch -128 bis 127.

So isses: addiert man z.B. -100 zu -50, müsste -150 rauskommen, wenn ich mich nicht verrechnet habe, aber das lässt sich nicht als signed byte darstellen. In dem Fall wird das OV-Flag gesetzt, d.h. die Rechnung hat den zulässigen Bereich verlassen.

Etwas technischer: OV wird gesetzt, wenn durch die Rechnung das Vorzeichen wechselt, obwohl es das nicht sollte - durch die Begrenzung auf 8 bit wird aus 10011100 + 11001110 -> 01101010, eine fälschlicherweise positive Zahl, daher OV. Das gleiche gilt bei 100 + 50, während bei 100 - 50 kein OV gesetzt wird.

Das ganze sollte man nicht überbewerten, die meisten Prozessoren haben garkein OV-Flag, man kann also auch drauf verzichten. Spezifisch ist es für den 8086.

Gruss Reinhard

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. das gibt es auch im dezimalen - wenn man sich an die vortaschenrechnerzeit erinnert. beispiel: eine addition im bereich 0x00 bis 0xFF (1 byte). addiert man 0xF0 und 0x33 erhält man als ergebnis 0x23 - und eine 1 im carry. diese 1 wird wichtig, wenn man mit zwei byte rechnet (im windowsrechner wird das ergebnis 0x123 angezeigt). zuerst addiert man das lowbyte, anschliessend das highbyte zuzüglich des carrys.

also:

hb1|lb1 + hb2|lb2 =
lb1+lb2=lb3(+c)
hb1+hb2(+c)=hb3

natürlich kann auch beim highbyte ein carry erzeugt werden…