Wat is “2’s complement”?

Ik volg een cursus computersystemen en worstelengedeeltelijk met Two’s Complement. Ik wil het begrijpen, maar alles wat ik heb gelezen heeft het plaatje voor mij niet bij elkaar gebracht. Ik heb het wikipedia-artikelen verschillende andere artikelen gelezen, waaronder mijn tekstboek.

Daarom wilde ik deze communitywiki-post starten om te definiëren wat Two’s Complement is, hoe het te gebruiken en hoe het getallen kan beïnvloeden tijdens operaties zoals casts (van ondertekend naar niet-ondertekend en vice versa) , bitsgewijze bewerkingen en bitverschuivingsbewerkingen.

Waar ik op hoop is een duidelijke en beknopte definitiedie gemakkelijk te begrijpen is door een programmeur.


Antwoord 1, autoriteit 100%

Two’s complementis een slimme manier om gehele getallen op te slaan, zodat veelvoorkomende wiskundige problemen eenvoudig te implementeren.

Om het te begrijpen, moet je denken aan de getallen in binair.

Het zegt eigenlijk:

  • gebruik voor nul alle nullen.
  • voor positieve gehele getallen, begin met optellen, met een maximum van 2(aantal bits – 1)-1.
  • doe voor negatieve gehele getallen precies hetzelfde, maar verwissel de rol van nullen en enen (dus in plaats van te beginnen met 0000, begin met 1111 – dat is het “complement”-gedeelte).

Laten we het proberen met een minibyte van 4 bits (we noemen het een knabbel– 1/2 byte).

  • 0000– nul
  • 0001– één
  • 0010– twee
  • 0011– drie
  • 0100tot 0111– vier tot zeven

Dat is zo ver als we kunnen gaan in positieve zin. 23-1 = 7.

Voor negatieven:

  • 1111– negatieve één
  • 1110– min twee
  • 1101– min drie
  • 1100tot 1000– min vier tot min acht

Houd er rekening mee dat u één extra waarde krijgt voor negatieven (1000= -8) die u niet krijgt voor positieven. Dit komt omdat 0000wordt gebruikt voor nul. Dit kan worden beschouwd als Number Linevan computers.

Onderscheid maken tussen positieve en negatieve getallen

Als je dit doet, krijgt het eerste bit de rol van het “teken”-bit, omdat het kan worden gebruikt om onderscheid te maken tussen niet-negatieve en negatieve decimale waarden. Als de meest significante bit 1is, dan kan het binaire getal negatief worden genoemd, terwijl alsof de meest significante bit (de meest linkse) 0is, je de decimale waarde is niet-negatief.

“Sign-magnitude”negatieve getallen hebben alleen het tekenbit omgedraaid van hun positieve tegenhangers, maar deze benadering heeft te maken met het interpreteren van 1000(één 1gevolgd door alle 0en) als “negatieve nul”, wat verwarrend is.

“Ones’ complement”negatieve getallen zijn slechts het bit-complement van hun positieve tegenhangers, wat ook leidt tot een verwarrende “negatieve nul” met 1111(allemaal).

U zult waarschijnlijk niet te maken hebben met de complementaire of Sign-Magnitude integer-representaties van Ones, tenzij u heel dicht bij de hardware werkt.


Antwoord 2, autoriteit 55%

Ik vraag me af of het beter kan worden uitgelegd dan het Wikipedia-artikel.

Het basisprobleem dat u probeert op te lossen met de twee-complementrepresentatie is het probleem van het opslaan van negatieve gehele getallen.

Beschouw eerst een geheel getal zonder teken dat is opgeslagen in 4 bits. U kunt het volgende hebben

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Deze zijn niet ondertekend omdat er geen indicatie is of ze negatief of positief zijn.

Tekengrootte en overtollige notatie

Om negatieve getallen op te slaan, kun je een aantal dingen proberen. Ten eerste kunt u de tekengroottenotatie gebruiken die het eerste bit toewijst als een tekenbit om +/- weer te geven en de resterende bits om de grootte weer te geven. Dus opnieuw 4 bits gebruiken en aannemen dat 1 betekent – en 0 betekent +, dan heb je

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Dus je ziet het probleem daar? We hebben een positieve en een negatieve 0. Het grotere probleem is het optellen en aftrekken van binaire getallen. De circuits die moeten worden opgeteld en afgetrokken met behulp van tekenmagnitude zullen zeer complex zijn.

Wat is

0010
1001 +
----

?

Een ander systeem is overtollige notatie. Je kunt negatieve getallen opslaan, je lost het probleem van twee nullen op, maar optellen en aftrekken blijft moeilijk.

Dus daar komt het complement van twee bij. Nu kunt u positieve en negatieve gehele getallen opslaan en relatief eenvoudig rekenen. Er zijn een aantal methoden om een getal om te zetten in een twee-complement. Hier is er een.

Decimaal converteren naar complement van twee

  1. Converteer het getal naar binair (negeer het teken voor nu)
    bijv. 5 is 0101 en -5 is 0101

  2. Als het getal een positief getal is, ben je klaar.
    bijv. 5 is 0101 in binair met twee-complementnotatie.

  3. Als het getal negatief is,

    3.1 vind het complement (inverteer nullen en enen)
    bijv. -5 is 0101, dus het complement vinden is 1010

    3.2 Voeg 1 toe aan het complement 1010 + 1 = 1011.
    Daarom is -5 in het complement van twee 1011.

Dus, wat als je 2 + (-3) binair wilt doen? 2 + (-3) is -1.
Wat zou u moeten doen als u tekengrootte zou gebruiken om deze getallen op te tellen? 0010 + 1101 = ?

Als je het complement van twee gebruikt, bedenk dan hoe gemakkelijk het zou zijn.

2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Het complement van twee naar decimaal converteren

1111 converteren naar decimaal:

  1. Het getal begint met 1, dus het is negatief, dus we vinden het complement van 1111, wat 0000 is.

  2. Voeg 1 toe aan 0000 en we krijgen 0001.

  3. Converteer 0001 naar decimaal, dat is 1.

  4. Breng het teken = -1 aan.

Tada!


Antwoord 3, autoriteit 20%

Zoals de meeste verklaringen die ik heb gezien, zijn de bovenstaande verklaringen duidelijk over hoe te werken met het complement van 2, maar leggen ze niet echt uit wat ze wiskundig zijn. Ik zal proberen dat te doen, in ieder geval voor gehele getallen, en ik zal eerst wat achtergrond behandelen die waarschijnlijk bekend is.

Onthoud hoe het werkt voor decimalen:
  2345
is een manier van schrijven
  2× 10 3+ 3× 102+ 4× 101+ 5× 100.

Op dezelfde manier is binair een manier om getallen te schrijven met alleen 0en 1volgens hetzelfde algemene idee, maar de 10s hierboven te vervangen door 2s. Dan in binair,
  1111
is een manier van schrijven
  1× 23+ 1× 22+ 1× 21+ 1× 20
en als je het uitrekent, blijkt dat 15 te zijn (grondtal 10). Dat komt omdat het
  8+4+2+1 = 15 is.

Dit is allemaal goed en wel voor positieve getallen. Het werkt zelfs voor negatieve getallen als je bereid bent er gewoon een minteken voor te zetten, zoals mensen doen met decimale getallen. Dat kan zelfs in computers, een soort van, maar ik heb zo’n computer niet meer gezien sinds het begin van de jaren ’70. Ik laat de redenen voor een andere discussie.

Voor computers blijkt het efficiënter om een complementrepresentatie te gebruiken voor negatieve getallen. En hier is iets dat vaak over het hoofd wordt gezien. Complementnotaties omvatten een soort omkering van de cijfers van het getal, zelfs de impliciete nullen die voor een normaal positief getal komen. Dat is onhandig, want de vraag rijst: allemaal? Dat kan een oneindig aantal cijfers zijn waarmee rekening moet worden gehouden.

Gelukkig vertegenwoordigen computers geen oneindigheden. Nummers zijn beperkt tot een bepaalde lengte (of breedte, als je dat liever hebt). Laten we dus terugkeren naar positieve binaire getallen, maar met een bepaalde grootte. Ik gebruik 8 cijfers (“bits”) voor deze voorbeelden. Dus ons binaire getal zou in werkelijkheid
  00001111
of
  0× 27+ 0× 26+ 0× 25+ 0× 2 4+ 1× 23+ 1 × 22+ 1× 2 1+ 1× 20

Om het 2-complement negatief te vormen, vullen we eerst alle (binaire) cijfers aan tot
  11110000
en voegen we 1 toe aan
 &nbsp ;11110001
maar hoe moeten we dat begrijpen als -15?

Het antwoord is dat we de betekenis van de bit van de hoogste orde (de meest linkse) veranderen. Dit bit is een 1voor alle negatieve getallen. De verandering zal zijn om het teken van zijn bijdrage te veranderen in de waarde van het getal waarin het voorkomt. Dus nu wordt begrepen dat onze 11110001
  –1× 27+ 1× 26+ 1× 25+ 1× 24+ 0× 23+ 0 × 22+ 0× 21+ 1× 20
Merk op dat “-” ervoor staat uitdrukking? Het betekent dat het tekenbit het gewicht -27draagt, dat wil zeggen -128 (grondtal 10). Alle andere posities behouden hetzelfde gewicht als ze hadden in niet-ondertekende binaire getallen.

Als je onze -15 uitrekent, is het
  -128 + 64 + 32 + 16 + 1
Probeer het op je rekenmachine. het is -15.

Van de drie belangrijkste manieren waarop ik negatieve getallen in computers heb gezien, wint het complement van 2 zonder twijfel voor het gemak bij algemeen gebruik. Het heeft wel een eigenaardigheid. Omdat het binair is, moet er een even aantal mogelijke bitcombinaties zijn. Elk positief getal kan worden gekoppeld aan een negatief getal, maar er is maar één nul. Als je een nul negeert, krijg je nul. Er is dus nog een combinatie, het getal met 1in het tekenbit en 0overal elders. Het corresponderende positieve getal zou niet passen in het aantal bits dat wordt gebruikt.

Wat nog vreemder is aan dit getal, is dat als je het positief probeert te vormen door er een aan te vullen en er één op te tellen, je hetzelfde negatieve getal terugkrijgt. Het lijkt natuurlijk dat nul dit zou doen, maar dit is onverwacht en helemaal niet het gedrag dat we gewend zijn, omdat we, afgezien van computers, over het algemeen denken aan een onbeperkte hoeveelheid cijfers, niet aan deze rekenkunde met een vaste lengte.

Dit is als het topje van een ijsberg van eigenaardigheden. Er ligt meer op de loer onder de oppervlakte, maar dat is genoeg voor deze discussie. U kunt waarschijnlijk meer vinden als u onderzoek doet naar “overflow” voor rekenen met vaste komma’s. Als je er echt mee aan de slag wilt, kun je ook onderzoek doen naar “modulaire rekenkunde”.


Antwoord 4, autoriteit 3%

Het complement van

2 is erg handig om de waarde van een binair bestand te vinden, maar ik heb een veel beknoptere manier bedacht om zo’n probleem op te lossen (nog nooit iemand anders het zien publiceren):

neem een binair getal, bijvoorbeeld: 1101 wat [ervan uitgaande dat spatie “1” het teken is] gelijk is aan -3.

met behulp van 2’s complement zouden we dit doen…flip 1101 naar 0010…add 0001 + 0010 ===> geeft ons 0011. 0011 in positief binair = 3. daarom 1101 = -3!

Wat ik me realiseerde:

in plaats van al het omdraaien en toevoegen, kun je gewoon de basismethode voor het oplossen van een positief binair getal (laten we zeggen 0101) is (23* 0) + (22 * 1) + (21* 0) + (20* 1) = 5.

Doe precies hetzelfde concept met een negatief!(met een kleine twist)

neem bijvoorbeeld 1101:

voor het eerste cijfer in plaats van 23* 1 = 8, doe -(23* 1) = – 8.

ga dan verder zoals gewoonlijk, doe -8+ (22* 1) + (21* 0) + (2< sup>0* 1) = -3


Antwoord 5, autoriteit 2%

Stel je voor dat je een eindig aantal bits/trits/cijfers/wat dan ook hebt. U definieert 0 als alle cijfers 0 zijn en telt natuurlijk op:

00
01
02
..

Uiteindelijk zul je overlopen.

98
99
00

We hebben twee cijfers en kunnen alle getallen van 0 tot 100 vertegenwoordigen. Al die getallen zijn positief! Stel dat we ook negatieve getallen willen weergeven?

Wat we echt hebben, is een cyclus. Het getal voor 2 is 1. Het getal voor 1 is 0. Het getal voor 0 is… 99.

Dus laten we voor de eenvoud zeggen dat elk getal boven de 50 negatief is. “0” tot en met “49” staan voor 0 tot en met 49. “99” is -1, “98” is -2, … “50” is -50.

Deze weergave is tientallencomplement. Computers gebruiken meestal twee-complement, wat hetzelfde is, behalve het gebruik van bits in plaats van cijfers.

Het leuke van het complement van tien is dat optellen gewoon werkt. U hoeft niets speciaals te doen om positieve en negatieve getallen toe te voegen!


Antwoord 6, autoriteit 2%

Ik las een fantastische uitleg op Redditdoor jng, de kilometerteller als analogie gebruiken.

voer hier de afbeeldingsbeschrijving in

Het is een nuttige conventie. Dezelfde circuits en logische bewerkingen die
optellen / aftrekken van positieve getallen in binair werk nog steeds op beide positieve
en negatieve getallen als je de conventie gebruikt, daarom is het zo
nuttig en alomtegenwoordig.

Stel je de kilometerteller van een auto voor, deze rolt rond op (zeg) 99999. Als je
als u 00000 verhoogt, krijgt u 00001. Als u 00000 verlaagt, krijgt u 99999
(vanwege het ronddraaien). Als je er een toevoegt aan 99999, gaat het terug naar
00000. Het is dus handig om te besluiten dat 99999 -1 voorstelt. Evenzo is het erg handig om te beslissen dat 99998 staat voor -2, enzovoort. Jij hebt
om ergens te stoppen, en ook volgens afspraak, de bovenste helft van de cijfers
worden als negatief beschouwd (50000-99999), en de onderste helft positief
staan gewoon voor zichzelf (00000-49999). Als resultaat, het bovenste cijfer
zijnde 5-9 betekent dat het weergegeven getal negatief is, en dat het 0-4 . is
betekent dat de weergegeven waarde positief is – precies hetzelfde als de bovenste bit
vertegenwoordigt teken in een twee-complement binair getal.

Dit begrijpen was ook moeilijk voor mij. Toen ik het eenmaal kreeg en terugging naar
herlees de boeken artikelen en uitleg (er was geen internet
toen), bleken veel van degenen die het beschreven niet echt
Begrijp het. Ik heb daarna wel een boek geschreven om assembler te leren
dat (wat 10 jaar lang redelijk goed verkocht).


Antwoord 7

Twee complement wordt gevonden door een op te tellen bij het eerste complement van het gegeven getal.
Laten we zeggen dat we het twee-complement van 10101moeten vinden en dan het enen-complement moeten vinden, dat wil zeggen, 01010voeg 1toe aan dit resultaat, dat wil zeggen , 01010+1=01011, wat het laatste antwoord is.


Antwoord 8

Laten we het antwoord 10 – 12 in binaire vorm krijgen met 8 bits:
Wat we echt gaan doen is 10 + (-12)

We moeten het complimentdeel van 12 krijgen om het van 10 af te trekken.
12 in binair is 00001100.
10 in binair is 000001010.

Om het compliment-gedeelte van 12 te krijgen, draaien we alle bits om en voegen er 1 toe.
12 in binair omgekeerd is 11110011. Dit is ook de inverse code (iemands complement).
Nu moeten we er een toevoegen, die nu 11110100 is.

Dus 11110100 is het compliment van 12! Makkelijk als je er zo over nadenkt.

Nu kun je de bovenstaande vraag van 10 – 12 in binaire vorm oplossen.

00001010
11110100
-----------------
11111110  

Antwoord 9

Als je naar het complementsysteem van de twee kijkt vanuit een wiskundig oogpunt, is het echt logisch. In het complement van tien is het idee om het verschil in wezen te ‘isoleren’.

Voorbeeld: 63 – 24 = x

We voegen het complement van 24 toe, wat eigenlijk gewoon (100 – 24) is. Dus eigenlijk is alles wat we doen 100 optellen aan beide kanten van de vergelijking.

De vergelijking is nu: 100 + 63 – 24 = x + 100, daarom verwijderen we de 100 (of 10 of 1000 of wat dan ook).

Vanwege de onhandige situatie dat we één getal moeten aftrekken van een lange reeks nullen, gebruiken we een ‘verminderd radix-complement’-systeem, in het decimale stelsel, negen-complement.

Als we een getal zien dat is afgetrokken van een grote reeks van negens, hoeven we de getallen alleen maar om te draaien.

Voorbeeld: 99999 – 03275 = 96724

Dat is de reden dat we na het negen-complement 1 toevoegen. Zoals je waarschijnlijk weet uit de wiskunde uit je kindertijd, wordt 9 10 door ‘stelen’ 1. Dus eigenlijk is het gewoon tien-complement dat 1 van het verschil neemt.

In binair is het complement van twee gelijk aan het complement van tien, terwijl het complement van één gelijk is aan het complement van negen. Het belangrijkste verschil is dat in plaats van te proberen het verschil te isoleren met machten van tien (toevoegen van 10, 100, enz. in de vergelijking), we proberen het verschil te isoleren met machten van twee.

Het is om deze reden dat we de bits omkeren. Net zoals onze minuend een reeks van negens in decimaal is, is onze minuend een reeks van enen in binair getal.

Voorbeeld: 111111 – 101001 = 010110

Omdat kettingen van enen 1 lager zijn dan een mooie macht van twee, ‘stelen’ ze 1 van het verschil zoals negens doen in decimalen.

Als we negatieve binaire getallen gebruiken, zeggen we eigenlijk alleen maar:

0000 – 0101 = x

1111 – 0101 = 1010

1111 + 0000 – 0101 = x + 1111

Om x te ‘isoleren’, moeten we 1 toevoegen omdat 1111 één verwijderd is van 10000 en we verwijderen de eerste 1 omdat we deze zojuist aan het oorspronkelijke verschil hebben toegevoegd.

1111 + 1 + 0000 – 0101 = x + 1111 + 1

10000 + 0000 – 0101 = x + 10000

Verwijder gewoon 10000 van beide kanten om x te krijgen, het is basisalgebra.


Antwoord 10

Veel van de antwoorden tot nu toe leggen goed uit waarom het complement van twee wordt gebruikt om een negatief getal weer te geven, maar vertel ons niet wat het complementnummer van twee is, vooral niet waarom een ‘1’ wordt toegevoegd, en in feite vaak wordt toegevoegd in een verkeerde manier.

De verwarring komt voort uit een slecht begrip van de definitie van een complementnummer. Een complement is het ontbrekende deel dat iets compleet zou maken.

Het radix-complement van een n-cijferig getal x in radix b is per definitie b^n-x.
In binair getal 4 wordt voorgesteld door 100, die 3 cijfers heeft (n=3) en een radix van 2 (b=2). Dus het radix-complement is b^n-x = 2^3-4=8-4=4 (of 100 in binair getal).

In binair is het verkrijgen van het complement van een radix echter niet zo eenvoudig als het verkrijgen van het verminderde radix-complement, dat wordt gedefinieerd als (b^n-1)-y, slechts 1 minder dan dat van het radix-complement. Om een verminderd radix-complement te krijgen, draai je gewoon alle cijfers om.

100 -> 011 (verminderd (een) radix-complement)

om het radix (twee-en) complement te verkrijgen, voegen we eenvoudig 1 toe zoals de gedefinieerde definitie.

011 +1 ->100 (twee complementair).

Laten we nu met dit nieuwe begrip eens kijken naar het voorbeeld gegeven door
Vincent Ramdhanie (zie bovenstaande tweede reactie)

/* begin van Vincent

1111 converteren naar decimaal:

Het getal begint met 1, dus het is negatief, dus we vinden het complement van 1111, wat 0000 is.
Tel 1 op bij 0000 en we krijgen 0001.
Converteer 0001 naar decimaal, dat is 1.
Pas het teken = -1 toe.
Tada!

einde van Vincent */

Moet worden begrepen als

Het getal begint met 1, dus het is negatief. Dus we weten dat het een twee-complement is van een waarde x. Om de x te vinden die wordt vertegenwoordigd door het complement van zijn twee, moeten we eerst het complement van zijn 1 vinden.

twee-complement van x: 1111
iemands complement van x: 1111-1 ->1110;
x = 0001, (draai alle cijfers om)

pas het teken – toe, en het antwoord =-x =-1.


Antwoord 11

Het woord complement is afgeleid van volledigheid. In de decimale wereld bieden de cijfers 0 tot en met 9 een complement(complete set) van cijfers of numerieke symbolen om alle decimale getallen uit te drukken. In de binaire wereld vormen de cijfers 0 en 1 een complementvan cijfers om alle binaire getallen uit te drukken. In feite moeten de symbolen 0 en 1 worden gebruikt om alles weer te geven (tekst, afbeeldingen, enz.), evenals positief (0) en negatief (1).
In onze wereld wordt de lege ruimte links van het getal als nul beschouwd:

                 35=035=000000035.

In een computeropslaglocatie is er geen lege ruimte. Alle bits (binaire cijfers) moeten 0 of 1 zijn. Voor een efficiënt gebruik van geheugennummers kunnen getallen worden opgeslagen als 8 bits, 16 bits, 32 bits, 64 bits en 128 bits. Wanneer een getal dat is opgeslagen als een 8-bits getal, wordt overgebracht naar een 16-bits locatie, moeten het teken en de grootte (absolute waarde) hetzelfde blijven. Zowel de 1-complement- als 2-complementrepresentaties vergemakkelijken dit.
Als een zelfstandig naamwoord:
Zowel het 1-complement als het 2-complement zijn binaire representaties van getekende hoeveelheden waarbij het meest significante bit (de linker) het tekenbit is. 0 is voor positief en 1 is voor negatief.
2s-complement betekent niet negatief. Het betekent een ondertekende hoeveelheid. Net als in decimaal wordt de grootte weergegeven als de positieve grootheid. De structuur gebruikt tekenextensie om de hoeveelheid te behouden bij het promoveren naar een register [] met meer bits:

      [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Als een werkwoord:
2’s complement betekent ontkennen. Het betekent niet negatief maken. Het betekent dat als negatief positief wordt; indien positief negatief maken. De grootte is de absolute waarde:

       if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Deze mogelijkheid maakt efficiënte binaire aftrekking mogelijk met ontkennen en vervolgens optellen.
a – b = a + (-b)

De officiële manier om het complement van de 1 te nemen is door voor elk cijfer de waarde af te trekken van 1.

       1'scomp(0101) = 1010.

Dit is hetzelfde als elke bit afzonderlijk omdraaien of omkeren. Dit resulteert in een negatieve nul die niet erg geliefd is, dus het toevoegen van één aan het 1-complement lost het probleem op.
Om het 2s-complement te ontkennen of te nemen, neemt u eerst het 1s-complement en voegt u vervolgens 1 toe.

       Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

In de voorbeelden werkt de ontkenning ook met uitgebreide getallen met teken.

Toevoegen:
1110 Dragen 111110 Dragen
0110 is hetzelfde als 000110
1111 111111
som 0101 som 000101

Aftrekken:

   1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Merk op dat wanneer u met het complement van 2 werkt, de lege ruimte links van het getal wordt gevuld met nullen voor positieve getallen, maar wordt gevuld met enen voor negatieve getallen. De carry wordt altijd toegevoegd en moet een 1 of 0 zijn.

Proost


Antwoord 12

Het complement van

2 is in wezen een manier om de additieve inverse van een binair getal te bedenken. Stel jezelf de volgende vraag: Gegeven een getal in binaire vorm (aanwezig op een geheugenlocatie met vaste lengte), welk bitpatroon, wanneer toegevoegd aan het originele getal (op de geheugenlocatie met vaste lengte), zou het resultaat allemaal nullen maken? (op dezelfde geheugenlocatie met vaste lengte). Als we dit bitpatroon zouden kunnen bedenken, dan zou dat bitpatroon de -ve representatie (additief inverse) van het oorspronkelijke getal zijn; omdat per definitie het toevoegen van een getal aan zijn additieve inverse altijd resulteert in nul. Voorbeeld: neem 5 die 101 aanwezig is in een enkele 8-bits byte. Nu is het de taak om een bitpatroon te bedenken dat, wanneer toegevoegd aan het gegeven bitpatroon (00000101) zou resulteren in allemaal nullen op de geheugenlocatie die wordt gebruikt om deze 5 vast te houdendwz alle 8 bits van de byte moet nul zijn. Om dat te doen, begint u met het meest rechtse bit van 101 en stelt u voor elk afzonderlijk bit opnieuw dezelfde vraag: welk bit moet ik toevoegen aan het huidige bit om het resultaat nul te maken? blijf dat doen rekening houdend met de gebruikelijke overdracht. Nadat we klaar zijn met de 3 meest rechtse plaatsen (de cijfers die het oorspronkelijke getal definiëren zonder rekening te houden met de voorloopnullen), gaat de laatste carry in het bitpatroon van de additieve inverse. Bovendien, aangezien we het originele getal in een enkele 8-bits byte houden, moeten alle andere leidende bits in de additieve inverse ook 1 zijn, zodat (en dit is belangrijk) wanneer de computer “het getal” toevoegt (weergegeven met de 8 bitpatroon) en zijn additieve inverse met behulp van “dat” opslagtype (een byte) zou het resultaat in die byteallemaal nullen zijn.

1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

Antwoord 13

Ik vond het antwoord van lavinio leuk, maar het verschuiven van bits voegt wat complexiteit toe. Vaak is er de keuze tussen bewegende bits met respect voor het tekenbit of zonder respect voor het tekenbit. Dit is de keuze tussen het behandelen van de getallen als ondertekend (-8 tot 7 voor een nibble, -128 tot 127 voor bytes) of niet-ondertekende nummers met volledig bereik (0 tot 15 voor nibbles, 0 tot 255 voor bytes).


Antwoord 14

Het is een slimme manier om negatieve gehele getallen zo te coderen dat ongeveer de helft van de combinatie van bits van een gegevenstype wordt gereserveerd voor negatieve gehele getallen, en de toevoeging van de meeste negatieve gehele getallen met hun corresponderende positieve gehele getallen resulteert in een carry overflow die het resultaat binair nul laat.

Dus, in het complement van 2 als één 0x0001 is, dan is -1 0x1111, want dat resulteert in een gecombineerde som van 0x0000 (met een overloop van 1).


Antwoord 15

2-complementen: wanneer we een extra één toevoegen met de 1-complementen van een getal, krijgen we de 2-complementen. Bijvoorbeeld: 100101 het complement van 1 is 011010 en het complement van 2 is 011010+1 = 011011 (door er een toe te voegen met het complement van 1) Voor meer informatie
dit artikel legt het grafisch uit.


Antwoord 16

In eenvoudige bewoordingen is het complement van 2's Complementeen manier om een negatief getal in het computergeheugen op te slaan. Terwijl positieve getallen worden opgeslagen als normaal binair getal.

Laten we dit voorbeeld eens bekijken,

Computer gebruikt Binary Number Systemom een willekeurig getal weer te geven.

x = 5;

Dit wordt weergegeven als 0101.

x = -5;

Als de computer het -teken tegenkomt, berekent hij zijn 2’s complement en slaat het op.
i.e5 = 0101 en het complement van zijn 2 is 1011.

Belangrijke regels die de computer gebruikt om getallen te verwerken zijn:

  1. Als het eerste bit 1is, moet het een negativegetal zijn.
  2. Als alle bits behalve de eerste bit 0zijn, dan is het een positief getal
    omdat er geen -0in het nummersysteem is.(1000 is not -0in plaats daarvan is het positief 8)
  3. Als alle bits 0zijn, dan is het 0.
  4. Anders is het een positive number.

Antwoord 17

Het complement van twee is een van de manieren om een negatief getal uit te drukken en de meeste controllers en verwerkers slaan een negatief getal op in de vorm van het complement van 2


Antwoord 18

Het complement van twee wordt voornamelijk gebruikt om de volgende redenen:

  1. Om meerdere representaties van 0 te vermijden
  2. Om te voorkomen dat je de carry-bit bijhoudt (zoals in je aanvulling) in geval van een overloop.
  3. Het uitvoeren van eenvoudige bewerkingen zoals optellen en aftrekken wordt eenvoudig.

Antwoord 19

REFERENTIE: https://www.cs.cornell. edu/~tomf/notes/cps104/twoscomp.html

Ik keer alle bits om en voeg 1 toe. Programmatisch:

 // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };
  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

Antwoord 20

2’s complement van een bepaald getal is het nr. verkregen door 1 toe te voegen met het 1’s complement van de nr.
stel dat we een binair nummer hebben: 10111001101
Het complement van 1 is: 01000110010
En het complement van zijn 2 zal zijn: 01000110011


Antwoord 21

Om een getal bitsgewijze aan te vullen, moet je alle bits erin omdraaien. Om het aan te vullen met twee, draaien we alle bits om en voegen er één toe.

Met behulp van de 2’s complement-representatie voor ondertekende gehele getallen, passen we de 2’s complement-bewerking toe om een positief getal om te zetten in zijn negatieve equivalent en vice versa. Dus als je bijvoorbeeld nibbles gebruikt, wordt 0001(1) 1111(-1) en als je de op opnieuw toepast, wordt teruggekeerd naar 0001.

Het gedrag van de bewerking bij nul is voordelig bij het geven van een enkele representatie voor nul zonder speciale behandeling van positieve en negatieve nullen. 0000is een aanvulling op 1111, die wanneer 1 wordt toegevoegd. loopt over naar 0000, wat ons één nul geeft in plaats van een positieve en een negatieve.

Een belangrijk voordeel van deze weergave is dat de standaardoptellingscircuits voor niet-ondertekende gehele getallen correcte resultaten opleveren wanneer ze erop worden toegepast. Bijvoorbeeld het toevoegen van 1 en -1 in nibbles: 0001 + 1111, de bits stromen uit het register en laten 0000achter.

Voor een vriendelijke introductie hebben de geweldige Computerphile een video over dit onderwerp gemaakt.


Antwoord 22

De vraag is ‘Wat is ‘2’s Complement’?’ Eenvoudig antwoord voor degenen die het theoretisch willen begrijpen (en ik die de andere, meer praktische antwoorden wil aanvullen): het complement van 2 is de representatie voor negatieve gehele getallen in het duale systeem waarvoor geen extra tekens zoals + en – nodig zijn.


Antwoord 23

Je kunt ook een online rekenmachine gebruiken om de twee complementaire binaire weergave van een decimaal getal te berekenen: http://www.convertforfree.com/twos-complement-calculator/


Antwoord 24

Het eenvoudigste antwoord:

1111 + 1 = (1)0000. Dus 1111 moet -1 zijn. Dan -1 + 1 = 0.

Het is perfect om dit allemaal voor mij te begrijpen.

Other episodes