Cel mai bun răspuns
La început trebuie să subliniem aceste puncte:
-
ALU
nu-i pasă dacă faceți matematică semnată sau nesemnată. -
ALU
face doar binele matematică și setează corespunzător steagurile. - În
signed numbers
bitul de semn este un bit care indică semnul numărului și se află în bitul cel mai semnificativ.
– În aritmetică nesemnată , trebuie să urmărim steagul de transport pentru a detecta erorile.
– În semnat aritmetică, trebuie să urmărim semnalizatorul de depășire pentru a detecta erorile.
– Semnalizare de transport este setat dacă:
- Adăugarea a două numere determină o realizare a celor mai semnificativi (cei mai la stânga) biți adde d.
-
1111 + 0001 = 0000
=> indicatorul de transport este activat. - scăderea a două numere necesită un împrumut în cel mai semnificativ (cel mai stâng ) biți scăpați.
-
0000 - 0001 = 1111
=> indicatorul de transport este activat.
– Overflow Flag este setat dacă:
- suma a două numere cu bitul de semn
off
dă un rezultat număr cu bitul de semnon
. -
0100 + 0100 = 1000
=> semnalizatorul de deversare este activat. - suma a două numere cu bitul de semn
on
dă un număr de rezultat cu bitul de semnoff
. -
1000 + 1000 = 0000
=> semnalizatorul de deversare este activat. - Rețineți că : semn mixt adăugarea nu activează niciodată semnalizatorul de revărsare.
– pentru a fi mai clar, să vedem cele 2 exemple:
1- presupunem următoarea adăugare binară `0111 + 0010 = 1001 `
– dacă facem matematică nesemnată
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = 9 // its ok, we only care about the carry flag
– dacă facem matematică semnată
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = -7 // error detected
2- presupunem următoarea adăugare binară `1111 + 0001 = 0000`
– dacă facem matematică nesemnată
1111 + 0001 = 0000 // carry flag is turned on.
15 + 1 = 0 // error detected
– dacă facem matematică semnată
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.
în cele din urmă, puteți găsi mai multe informații aici: http://teaching.idallen.com/dat2343/10f/notes/040\_overflow.txt
Răspuns
Din punct de vedere mecanicist, semnalizatorul de transport este setat atunci când există o efectuare a celui mai semnificativ bit. Semnalizatorul de revărsare este setat atunci când există un carry în cel mai semnificativ bit.
Cu aritmetică nesemnată trebuie să vă faceți griji doar cu privire la carry steag. Dacă se realizează ceva din bitul cel mai semnificativ, atunci rezultatul este prea mare pentru a fi cuprins într-un singur registru.
Pentru aritmetica semnată situația este mai complexă. Depășirea are loc atunci când semnalizatorul de transport și semnalizatorul de depășire sunt diferite. Iată toate alternativele pentru adăugarea pe doi biți.
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
Rețineți că liniile 2, 5 și 6 produc rezultate incorecte datorită revărsării și că acestea sunt, de asemenea, atunci când CF este diferit de OF.
Unii procesoare pot face această comparație pentru dvs. și OF-ul pe care îl vedeți ar putea fi rezultatul comparării unui steag intern de transport cu steagul de transport (out). Va fi în continuare valabil numai pentru aritmetica semnată.
Funcționează și cu alte aritmetice, inclusiv multiplicarea.