Nejlepší odpověď
Na začátku musíme tyto body zdůraznit:
-
ALU
se nestará o to, jestli děláte podepsanou nebo nepodepsanou matematiku. -
ALU
dělá pouze binární matematiku a vhodně nastaví příznaky. - v
signed numbers
bit znaménka je bit, který označuje znaménko čísla. Je umístěn v nejvýznamnějším bitu.
– V nepodepsaná aritmetika, je třeba sledovat příznak přenášení, aby se zjistily chyby.
– V podepsáno arithmetic, musíme sledovat příznak přetečení, abychom zjistili chyby.
– Carry Flag je nastaven, pokud:
- přidání dvou čísel způsobí provedení nejvýznamnějších (nejvíce vlevo) bitů adde d.
-
1111 + 0001 = 0000
=> příznak nošení je zapnutý. - odčítání dvou čísel vyžaduje výpůjčku na nejvýznamnější (úplně vlevo) ) odečtené bity.
-
0000 - 0001 = 1111
=> příznak přenosu je zapnutý.
– Příznak přetečení je nastaven, pokud:
- součet dvou čísel se znaménkovým bitem
off
přinese výsledek číslo se znaménkovým bitemon
. -
0100 + 0100 = 1000
=> příznak přetečení je zapnutý. - součet dvou čísel se znaménkovým bitem
on
získá výsledné číslo se znaménkovým bitemoff
. -
1000 + 1000 = 0000
=> příznak přetečení je zapnutý. - Všimněte si, že : smíšený znak doplněk nikdy nezapne příznak přetečení.
– aby bylo jasnější, podívejme se na tyto 2 příklady:
1- předpokládejme následující binární doplněk `0111 + 0010 = 1001 `
– pokud děláme nepodepsanou matematiku
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = 9 // its ok, we only care about the carry flag
– pokud děláme podepsanou matematiku
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = -7 // error detected
2- předpokládejme následující binární sčítání `1111 + 0001 = 0000`
– pokud děláme nepodepsanou matematiku
1111 + 0001 = 0000 // carry flag is turned on.
15 + 1 = 0 // error detected
– pokud děláme podepsanou matematiku
1111 + 0001 = 0000 // carry flag is turned on.
-1 + 1 = 0 // its ok we only care about the overflow flag
// remember: Mixed-sign addition never turns on the overflow flag.
konečně najdete další informace zde: http://teaching.idallen.com/dat2343/10f/notes/040\_overflow.txt
Odpověď
Z mechanistického hlediska je příznak carry nastaven, když je proveden nejvýznamnější bit. Příznak přetečení je nastaven, když je do nejvýznamnějšího bitu.
S nepodepsanou aritmetikou si musíte dělat starosti pouze s carry vlajka. Pokud se něco provádí z nejvýznamnějšího bitu, pak je výsledek příliš velký na to, aby byl obsažen v jediném registru.
U aritmetiky se znaménkem je situace složitější. Přetečení nastane, když se příznak přenášení a příznak přetečení liší. Zde jsou všechny alternativy přidání na dva bity.
00 + 00 = 00, (0 + 0 = 0 decimal), CF = 0, OF = 0
01 + 01 = 10, (1 + 1 = -2 decimal) CF = 0, OF = 1 overflow
01 + 10 = 11, ( 1 + -2 = -1 decimal), CF = 0, OF = 0
01 + 11 = 00, ( 1 + -1 = 0 decimal), CF = 1, OF = 1
10 + 10 = 00, ( -2 + -2 = 0 decimal), CF = 1, OF = 0 overflow
10 + 11 = 01, ( -2 + -1 = 1 decimal), CF = 1, OF = 0 overflow
11 + 11 = 10, (-1 + -1 = -2 decimal), CF = 1, OF = 1
Všimněte si, že řádky 2, 5 a 6 produkují nesprávné výsledky kvůli přetečení a že jsou také tehdy, když se CF liší od OF.
Některé procesory mohou provést toto srovnání pro vás a OF, který vidíte, může být výsledek porovnání interního příznaku odbavení s příznakem provedení (vynesení). Stále bude platit pouze pro aritmetiku se znaménkem.
Funguje také s jinou aritmetikou, včetně násobení.