Hoe wordt overloop gedetecteerd in het complement van twee?

Ik zie dat wanneer ik positieve en negatieve getallen aftrek met behulp van two's complementik overflows krijg. Als ik bijvoorbeeld 1 van 2 aftrek, krijg ik:

2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001

Dus hier heeft het resultaat het vijfde linkerbit 10001– is het overloop?
Ik heb deze regels gevonden voor gedetecteerde overflows met two’s complement:

Als de som van twee positieve getallen een negatief resultaat oplevert, is de som
is overgelopen. Als de som van twee negatieve getallen een positieve geeft
resultaat, de som is overgelopen. Anders is de som niet overgelopen.

Kan iemand deze nader toelichten en een voorbeeld laten zien?


Antwoord 1, autoriteit 100%

Laten we beginnen met een antwoord op je titelvraag.

Hoe wordt overflow gedetecteerd in het complement van twee?

Overloopregel: als twee getallen met hetzelfde teken (zowel positief als beide negatief) worden opgeteld, treedt overloop op als en alleen als het resultaat het tegenovergestelde teken heeft.

Maar u stelt iets anders over de hoofdtekst van uw vraag naar uw voorbeeld.

Dus hier heeft het resultaat het vijfde linkerbit 10001– is het overloop?

Nee! er is hier geen overloop. Dat vijfde bit is het dragen/lenen. Dragen als je het over toevoeging hebt. Leen als je het over aftrekken hebt.

Overloop treedt op wanneer het getal dat u probeert weer te geven buiten het bereik van getallen valt dat kan worden weergegeven. In uw voorbeeld gebruikt u 4-bits twee-complement, wat betekent dat u elk getal in het bereik -8(1000) tot +7(0111). Het resultaat van uw aftrekking 2-1is +1, een getal dat binnen het representatiebereik ligt.

Als we een negatieve en een positieve operand toevoegen, zal het resultaat altijd binnen het representatiebereik liggen. Overlopen treden op wanneer we twee getallen met hetzelfde teken optellen (beide positief of beide negatief) en het resultaat heeft het tegenovergestelde teken.

De meeste misverstanden over carry-out en overflow komen voort uit het feit dat we de carry-out gebruiken als een van de parameters om overflow-vlag te genereren. Ze zijn sterk verwant, maar ze zijn niet hetzelfde.

Bij het optellen van getallen in twee-complement, als de carry-out en de carry-on in de meest significante bit (tekenbit) verschillend zijn, betekent dit dat er een overloop is opgetreden.

Laten we eens kijken naar twee negatieve operanden met een positief resultaat:

-8 + (-1) = -9 
 1000  (carry)
  1000 (-8)
+ 1111 (-1)
------
  0111 (+7) OVERFLOW!

De carry-out is 1 en de carry-on naar tekenbit (MSB) is 0.

En nu een voorbeeld van twee positieve operanden met een negatief resultaat.

+7 + 1 = +8
 0111  (carry)
  0111 (+7)
+ 0001 (+1)
------
  1000 (-8) OVERFLOW!

De carry-out is 0 en de carry-on naar tekenbit (MSB) is 1.


Antwoord 2, autoriteit 12%

@GabrielOshiro’s antwoord is echt goed. Ik wil hier gewoon een beetje logica toevoegen. Als je hier 2 en -1 bij elkaar optelt,

2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001

Je moet het meest significante bit in het negatieve getal scheiden van de rest van de bits, omdat in het twee-complement dat bit een negatieve waarde heeft. Dus als je eerst al het andere toevoegt:

0010 + 0111(leave out the leftmost 1 for now) = 1001

Hierna kunnen we duidelijk zien dat het vijfde bit in “10001” wordt veroorzaakt door het toevoegen van de “1” die we eerder hebben achtergelaten (in het vierde bit) met 1001, wat een carry in het vijfde bit oplevert. Echter, aangezien deze “1” echt zou moeten opheffen met de 1001, laat ons 0001 over, we kunnen het extra bit in “10001” hier gerust negeren.

Een meer diepgaande redenering zou zijn om te overwegen wanneer we dit extra beetje veilig kunnen negeren en wanneer niet. Zoals @GabrielOshiro al zei, wanneer de overdracht van en de overdracht naar de meest significante verschillen, kunnen we dit niet negeren. Bij een carry-out gaan 2 eenheden van negatieve getallen verloren omdat er geen ruimte is om het extra bit vast te houden, en bij een carry-in gaan twee eenheden van positieve getallen verloren, aangezien wat een eenheid van positief getal zou moeten zijn, wordt beschouwd als in plaats daarvan een eenheid van negatief. Hier 1 – (-1) = 2. Daarom zullen een carry-on en een carry-out elkaar opheffen. Maar wanneer slechts één van deze voorkomt, is het resultaat onjuist, dus hebben we een overloop.

Other episodes