Meilleure réponse
Au début, nous devons souligner ces points:
-
ALU
ne se soucie pas de savoir si vous faites des mathématiques signées ou non signées. -
ALU
fait juste le binaire math et définit les indicateurs de manière appropriée. - In
signed numbers
le bit de signe est un bit qui indique le signe du nombre. et Il est situé dans le bit le plus significatif.
– Dans unsigned arithmétique, nous devons surveiller lindicateur de retenue pour détecter les erreurs.
– Dans signé arithmétique, nous devons surveiller lindicateur de débordement pour détecter les erreurs.
– Le Carry Flag est défini si:
- laddition de deux nombres entraîne une exécution des bits les plus significatifs (les plus à gauche) adde d.
-
1111 + 0001 = 0000
=> lindicateur de report est activé. - la soustraction de deux nombres nécessite un emprunt dans le plus significatif (le plus à gauche ) bits soustraits.
-
0000 - 0001 = 1111
=> lindicateur de report est activé.
– le Lindicateur de débordement est défini si:
- la somme de deux nombres avec le bit de signe
off
donne un résultat numéro avec le bit de signeon
. -
0100 + 0100 = 1000
=> lindicateur de dépassement de capacité est activé. - la somme de deux nombres avec le bit de signe
on
donne un résultat avec le bit de signeoff
. -
1000 + 1000 = 0000
=> lindicateur de dépassement de capacité est activé. - Notez que : signe mixte Laddition nactive jamais lindicateur de débordement.
– pour clarifier les choses, voyons ces 2 exemples:
1- supposons laddition binaire suivante `0111 + 0010 = 1001 `
– si nous faisons des mathématiques non signées
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = 9 // its ok, we only care about the carry flag
– si nous faisons des mathématiques signées
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = -7 // error detected
2- Supposons laddition binaire suivante `1111 + 0001 = 0000`
– si nous faisons des mathématiques non signées
1111 + 0001 = 0000 // carry flag is turned on.
15 + 1 = 0 // error detected
– si nous faisons des mathématiques signées
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.
enfin, vous pouvez trouver plus dinformations ici: http://teaching.idallen.com/dat2343/10f/notes/040\_overflow.txt
Réponse
Dun point de vue mécanique, le drapeau de retenue est positionné quand il y a un report du bit le plus significatif. Lindicateur de débordement est défini lorsquil y a un report dans le bit le plus significatif.
Avec larithmétique non signée, vous navez quà vous soucier du report drapeau. Si quelque chose est effectué sur le bit le plus significatif, le résultat est trop grand pour être contenu dans un seul registre.
Pour larithmétique signée, la situation est plus complexe. Un débordement se produit lorsque lindicateur de report et lindicateur de débordement sont différents. Voici toutes les alternatives pour laddition sur deux bits.
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
Notez que les lignes 2, 5 et 6 produisent des résultats incorrects en raison dun débordement et que ce sont également lorsque CF est différent de OF.
Certains processeurs peuvent faire cette comparaison pour vous et lOF que vous voyez peut être le résultat de la comparaison dun drapeau de report interne avec le drapeau de retenue (sortie). Il ne sera toujours valable que pour larithmétique signée.
Il fonctionne également avec dautres arithmétiques, y compris la multiplication.