Per l'addizione (e la sottrazione) utilizzando il complemento a due non vi è alcuna nozione di segno o non firmato per quanto riguarda la logica. Moltiplicare e dividere, sì, a causa dell'estensione del segno richiesta.
Prendere tutte le combinazioni di numeri a 3 bit da 000 a 111 e aggiungerle a tutte le combinazioni di numeri a 3 bit, qualcosa di gestibile. Magari scrivi un programma se vuoi o fallo a mano. O fai solo le casse d'angolo. Per ciascun esame, ciascun operando come firmato o non firmato utilizza due complementi. Noterai che la stessa aggiunta funziona. 1 + 110 = 111. Ora è che 1 + (-2) = -1 o era 1 + 6 = 7. Entrambi funzionavano.
Il flag di carry è il trabocco UNSIGNED, la bandiera V è l'overflow FIRMATO, è per questo che si calcola sia così l'utente, chissà se quelli sono firmati o numeri senza segno può scegliere il diritto condizionato. Ed è per questo che hai firmato il salto se maggiore o uguale rispetto a un salto senza segno se maggiore o uguale.
È la bellezza di due complementi che fa funzionare tutto.
Moltiplicare (e dividere) è diverso, perché è necessario firmare l'estensione. Moltiplicare in binario ha una bella caratteristica, nel senso che se ci pensate
abcd
* 0011
=======
abcd
abcd
0000
0000
=======
Un po 'è 1 o 0, quindi si stanno moltiplicando il numero superiore da uno o pari a zero, si sia aggiunge spostato o dont. Ma notate anche che molto molto rapidamente andrete in overflow. Sappiamo dalla scuola elementare che n^x * n^y = n^(x + y).Se i registri sono larghi con Z di larghezza, le posizioni di bit più significative degli operandi non possono essere maggiori di Z quando vengono aggiunte altrimenti si rovesciano. Quattro bit 0010 * 0010 dovrebbero funzionare ma 0010 * 1000 andrà in overflow. Il modo giusto è che il risultato è due volte più largo degli operandi.
Quindi cosa succede se voglio moltiplicare 1111 * 0010?
Questo è fondamentalmente
0000
1111
0000
+0000
========
0011110
attesa era che un 15 (0b1111) o -1 (0b1111)? -1 * 2 = -2, che non è quello che abbiamo ottenuto in precedenza, abbiamo fatto un moltiplicano non firmato per fare un firmato moltiplicano dobbiamo firmare estendere e lanciamo bit al largo della sinistra
11..1111
*00..0010
=========
00000000
1111111
000000
00000
=========
11111110
e che dà la risposta giusta per una moltiplicazione firmata di due registri a quattro bit 1111 e 0010.
L'aggiunta funziona perché interessa solo una colonna. Ogni colonna ha un riporto, due operandi un risultato e un risultato. E poi puoi farlo a cascata quanto vuoi tu. Con un singolo bit hai 0 e 1. Lo zero è solo zero non più o meno zero, l'1 può essere un +1 o un -1. Trovo più facile lavorare attraverso le combinazioni con più di una colonna, ma potrebbe essere fatto. Per oltre il riporto in è un 0 in modo non ho bisogno di rappresentarla operando A, operando b, eseguire, e il risultato
00 00 0 + 0 = 0
01 01 0 + 1 = 1; 0 + (-1) = -1
10 01 1 + 0 = 1; (-1) + 0 = -1
11 10 1 + 1 = 0 unsigned overflow. -1 + 1 = 0, 1 + -1 = 0, -1 + -1 = 0 signed overflow
Tecnicamente tutti quelli firmati erano un overflow firmato in questo ultimo caso, e questo è il caso speciale con cui trattate per un numero qualsiasi di bit, prendete un registro a tre bit 100 + 100 = 000 + esegui 1 è un 4 + 4 = 0 di overflow senza segno o è un -4 + -4 = 0 con un overflow firmato? Questo è il motivo per cui è più facile vedere quando si usano alcuni bit e si passano attraverso le combinazioni che lanciano il caso problema di 1 e quindi tutti gli zeri.
Un overflow firmato è quando il carry in della colonna più significativa non corrisponde al completamento. un overflow senza segno è quando l'esecuzione del msbit è uno.
La sottrazione in logica viene eseguita con l'aggiunta, sappiamo dalla scuola elementare che a - b = a + (-b) e sappiamo dalle classi di programmazione che prendere il negativo usando due si completano e si aggiungono. Bene, questo funziona alla grande, possiamo semplicemente invertire il secondo operando e invertire il carry-in dell'isbit rendendolo uno o invertirlo e aggiungerne uno. Ed è così che funziona. L'esecuzione è a volte invertita che esce dall'alluminio per indicare un prestito. Devi guardare le combinazioni di bandiera per capirlo, alcuni processori invertono il portare fuori alcuni. A volte si può dire dalla sottrazione con un prestito se il proprio ISA ha questa istruzione.
So TL: DR ... coperto più di quello che hai chiesto.
add/sub sono gli stessi per il complemento di unsigned vs. 2. Vedi [Understanding Carry vs. Overflow conditions/flags] (http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt). Questo viene dal [wiki tag x86] (http://stackoverflow.com/tags/x86/info). –