Migliore risposta
Allinizio dobbiamo sottolineare questi punti:
-
ALU
non si preoccupa se stai facendo matematica con o senza segno. -
ALU
fa solo il binario matematica e imposta i flag in modo appropriato. - In
signed numbers
il bit di segno è un bit che indica il segno del numero e si trova nel bit più significativo.
– In unsigned aritmetica, dobbiamo controllare il carry flag per rilevare gli errori.
– In signed aritmetica, dobbiamo controllare il flag di overflow per rilevare gli errori.
– Il flag di trasporto è impostato se:
- laggiunta di due numeri provoca lesecuzione dei bit più significativi (più a sinistra) adde d.
-
1111 + 0001 = 0000
=> il flag carry è attivato. - la sottrazione di due numeri richiede un prestito nel più significativo (a sinistra ) bit sottratti.
-
0000 - 0001 = 1111
=> il flag carry è attivato.
– il Flag di overflow è impostato se:
- la somma di due numeri con il bit di segno
off
restituisce un risultato numero con il bit di segnoon
. -
0100 + 0100 = 1000
=> il flag di overflow è attivato. - la somma di due numeri con il bit di segno
on
restituisce un numero di risultato con il bit di segnooff
. -
1000 + 1000 = 0000
=> il flag di overflow è attivato. - Tieni presente che : segno misto Laddizione non attiva mai il flag di overflow.
– per rendere più chiaro “s vedere questi 2 esempi:
1- supponi la seguente aggiunta binaria` 0111 + 0010 = 1001 `
– se stiamo facendo matematica senza segno
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = 9 // its ok, we only care about the carry flag
– se stiamo facendo matematica con segni
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = -7 // error detected
2- supponi la seguente aggiunta binaria `1111 + 0001 = 0000`
– se stiamo facendo matematica senza segno
1111 + 0001 = 0000 // carry flag is turned on.
15 + 1 = 0 // error detected
– se stiamo facendo matematica con segni
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.
infine, puoi trovare maggiori informazioni qui: http://teaching.idallen.com/dat2343/10f/notes/040\_overflow.txt
Risposta
Da un punto di vista meccanicistico, il contrassegno di riporto viene impostato quando viene eseguito il bit più significativo. Il flag di overflow viene impostato quando cè un carry nel bit più significativo.
Con laritmetica senza segno devi solo preoccuparti del carry bandiera. Se viene eseguito qualcosa dal bit più significativo, il risultato è troppo grande per essere contenuto in un singolo registro.
Per laritmetica con segno la situazione è più complessa. Loverflow si verifica quando il flag di riporto e il flag di overflow sono diversi. Ecco tutte le alternative per laggiunta su due bit.
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
Nota che le righe 2, 5 e 6 producono risultati errati a causa delloverflow e che questi sono anche quando CF è diverso da OF.
Alcuni processori potrebbero fare questo confronto per te e OF che vedi potrebbe essere il risultato del confronto di un flag di carry-in interno con il flag di carry (out). Sarà ancora valido solo per laritmetica con segno.
Funziona anche con altri aritmetici, inclusa la moltiplicazione.