Er zijn drie verschillende manieren om ondertekend geheel getal (artikel) weer te geven. a: ondertekend bit, b: 1-complement, en c: 2-complement. Laten we proberen te begrijpen hoe deze methoden tot stand zijn gekomen en waarom het 2-complement de voorkeur heeft boven andere.
Zoals we weten, worden gegevens in bits opgeslagen. Hoe kunnen we een geheel getal met teken in het geheugen opslaan? Om dit probleem op te lossen, zullen we eerst een naïeve oplossing ontwikkelen en deze vervolgens herhalen totdat we de beste oplossing voor ons probleem hebben.
a) Gesigneerd bit
Bij het opslaan van een geheel getal met teken lijkt het voor de hand liggend om de meest linkse bit te reserveren voor teken en de resterende bits te gebruiken om de waarden daadwerkelijk op te slaan. Bijvoorbeeld: in een 4-bitssysteem wordt het eerste bit van links gereserveerd voor teken (0 vertegenwoordigt positief terwijl 1 negatief vertegenwoordigt) en de andere 3 bits worden gebruikt om de waarden op te slaan. Op dezelfde manier wordt in een 8-bit-systeem het eerste bit van links gebruikt voor teken en de resterende 7 worden gebruikt voor waarden.
| Meneer Nee. | Binaire representatie | Decimale waarde |
| A | 0000 | +0 |
| B | 0001 | +1 |
| C | 0010 | +2 |
| D | 0011 | +3 |
| EN | 0100 | +4 |
| F | 0101 | +5 |
| G | 0110 | +6 |
| H | 0111 | +7 |
| I | 1000 | -0 |
| J | 1001 | -1 |
| K | 1010 | -2 |
| L | 1011 | -3 |
| M | 1100 | -4 |
| N | 1101 | -5 |
| O | 1110 | -6 |
| P | 1111 | -7 |
Door deze aanpak te gebruiken, zijn we met succes in staat een geheel getal met teken weer te geven. Maar als we het nader analyseren, kunnen we de volgende nadelen waarnemen:
1) Twee representaties van nul:
In een 4-bitssysteem zouden we 16 (24) waarden moeten kunnen opslaan, maar +1 tot +7 en -1 tot -7 zijn slechts 14 waarden. Waar zijn de resterende twee waarden? Als we de tabel zorgvuldig bekijken, zullen we ontdekken dat deze twee waarden convergeren naar 0. We hebben dus twee representaties van nul, dat wil zeggen een representatie voor +0 en een andere voor -0.
Maar zijn twee representaties van 0 een grote zorg? Dus? In plaats van 16 unieke waarden kunnen we slechts 15 waarden opslaan. We kunnen het ons toch veroorloven om het bereik met 1 te verkleinen, nietwaar? Voor de softwareontwikkelaar is dit misschien geen probleem, maar voor een circuitontwerper kan het erg frustrerend zijn om eerst te controleren of de waarde +0 is en vervolgens te controleren of deze -0 is.
2) Ondertekende extensie werkt niet voor negatieve getallen:
De omvang van de gegevens neemt snel toe. Op een gegeven moment moeten we het bitsysteem uitbreiden, zodat we het bereik aan gegevens dat kan worden opgeslagen, kunnen vergroten. In 2014 overschreed de Gangnam Style-video de YouTube-weergavelimiet en dwong YouTube het aantal weergaven te upgraden van 32-bits naar 64-bits geheel getal met teken. Op dezelfde manier zal de 32-bits Unix-klok op 19 januari 2038 overlopen omdat deze de tijd in seconden registreert in een 32-bits geheel getal met teken.
Het is dus net zo belangrijk dat ons representatiesysteem gemakkelijk uitbreidbaar is, wat met dit representatiesysteem niet mogelijk is.
| Decimale | 4-bits | 5-bit | 6-bitspyspark |
| +2 | 0010 | 00010 | 000010 |
| +7 | 0111 | 00111 | 000111 |
| -2 | 1010 | 10010 (!= 11010) | 100010 (!= 111010) |
| -7 | 1111 | 10111 (!= 11111) | 100111 (!= 111111) |
3) Binaire optelling werkt niet:
Laten we proberen twee binaire getallen toe te voegen:
| Binair | Decimale | Binair | Decimale | Binair | Decimale | |||
| Nummer 1 | 0010 | +2 | 0111 | +7 | 1101 | -5 | ||
| Nummer 2 | 1010 | -2 | 1010 | -2 | 0011 | +3 | ||
| Binaire optelling | 1100 | -4 | 0001 | +1 | 0000 | +0 | ||
| Decimale optelling | +0 | +5 | -2 |
Waarom werkt een eenvoudige binaire optelling hier niet? De reden is dat het tekenbit (meest links) geen gewoon bit is en geen deel uitmaakt van het werkelijke getal. Stel je de situatie voor waarin je de hardwarecircuits moet ontwerpen om de tekenbit te negeren om optelling uit te voeren en vervolgens de tekenbit toe te voegen.
Dit was dus een naïeve manier om een geheel getal met teken weer te geven. Het grootste probleem met deze aanpak is dat we negatieve getallen van onder naar boven in kaart hebben gebracht. Als we ons kaartsysteem zo veranderen dat ze van bovenaf worden weergegeven, zullen een aantal van de bovenstaande problemen worden opgelost.
b) 1's Co implementeren
Als we onze negatieve getallen van boven naar beneden opnieuw toewijzen, krijgen we de volgende binaire tabel:
| Ja nee. | Binaire representatie | Decimale waarde | |
| 1’s complement | Gesigneerd stukje | ||
| A | 0000 | +0 | +0 |
| B | 0001 | +1 | +1 |
| C | 0010 | +2 | +2 |
| D | 0011 | +3 | +3 |
| EN | 0100 | +4 | +4 |
| F | 0101 | +5 | +5 |
| G | 0110 | +6 | +6 |
| H | 0111 | +7 | +7 |
| I | 1000 | -7 | -0 |
| J | 1001 | -6 | -1c#-schakelaar |
| K | 1010 | -5 | -2 |
| L | 1011 | -4 | -3 |
| M | 1100 | -3 | -4 |
| N | 1101 | -2 | -5 |
| O | 1110 | -1 | -6 |
| P | 1111 | -0 | -7 |
Hoe krijg ik een binaire weergave van een geheel getal in de 1-complementmethode?
- Positieve getallen worden op dezelfde manier weergegeven als de methode met gehele getallen met teken
- Negatieve getallen worden weergegeven door elk bit van het overeenkomstige positieve getal om te keren (inverteren kan eenvoudig worden gedaan door de NOT-poort te gebruiken tijdens het hardwareontwerp)
Laten we dit nauwkeurig analyseren om te zien of we enige verbetering hebben bereikt.
1) Twee representaties van nul:
Ook in deze benadering hebben we twee representaties van nul.
2) Ondertekende extensie werkt niet voor negatieve getallen:
Ondertekende extensie werkt perfect voor negatieve getallen.
| Decimale | 4-bits | 5-bit | 6-bits |
| +2 | 0010 | 00010 | 000010 |
| +7 | 0111 | 00111 | 000111 |
| -2 | 1101 | 11101 | 111101 |
| -7 | 1000 | 11000 | 111000 |
3) Binaire optelling werkt met aangepaste regels:
| Binair | Decimale | Java-lijst | Binair | Decimale | Binair | Decimale | ||
| Nummer 1 | 0010 | +2 | 0111 | +7 | 1010 | -5 | ||
| Nummer 2 | 1101 | -2 | 1101 | -2 | 0011 | +3 | ||
| Binaire optelling | 1111 | -0 | 0100 | +4 | 1101 | -2 | ||
| Decimale optelling | +0 | +5 | -2 |
Het antwoord is niet altijd correct, maar het komt wel heel dicht in de buurt van het juiste antwoord. We kunnen het laten werken als we de regel volgen als je een carry forward aan je linkerhand hebt gegenereerd, gooi het dan niet weg, maar breng het terug en voeg het toe aan het meest rechtse deel.
| Binair | Decimale | Binair | Decimale | Binair | Decimale | |||
| Nummer 1 | 0111 | +7 | 1110 | -1 | 0111 | +7 | ||
| Nummer 2 | 1101 | -2 | 1001 | -6 | 1011 | -4 | ||
| Binaire optelling | (1) 0100 | +4 | (1) 0111 | +7 | (1) 0010 | +2 | ||
| Voorwaartse overdracht naar achteren toevoegen | 0101 | +5 | 1000 | -7 | 0011 | +3 |
De complementmethode van 1 is absoluut beter dan de ondertekende bit. Onze grootste zorgen zijn opgelost, maar blijven een probleem (met twee representaties van nul) en onze hack in binaire optelling geeft aanwijzingen om de 1-complementmethode te verbeteren. Laten we die zinnen opnieuw formuleren om het gemakkelijker te maken.
- We hebben een extra representatie van nul die niet nodig is
- Als we twee binaire getallen optellen, moeten we, als we een overdracht in het meest linkse bit hebben, +1 optellen bij het resultaat, dat wil zeggen dat het juiste antwoord kan worden gevonden door naar de volgende rij in de binaire tabel te gaan.
Beiden vertellen ons dat een extra representatie van nul de hoofdoorzaak van het probleem is. Laten we dus deze extra nul verwijderen en alle negatieve waarden naar de volgende rij verplaatsen (-7 gaat van I -> J, -6 gaat van J -> K enzovoort...)
c) 2-complement
Wanneer we -0 verwijderen uit de 1-complementtabel en alle negatieve waarden één rij naar beneden verschuiven, krijgen we de volgende tabel die het 2-complement wordt genoemd:
| Ja nee. | Binaire representatie | Decimale waarde | |||
| 2’s complement | 1’s complement | Gesigneerd stukje | |||
| A | 0000 | +0 | +0 | +0 | |
| B | 0001 | +1 | +1 | +1 | |
| C | 0010 | +2 | +2 | +2 | |
| D | 0011 | +3 | +3 | +3 | |
| EN | 0100 | +4 | +4 | +4 | |
| F | 0101 | +5 | +5 | +5 | |
| G | 0110 | +6 | +6java concat-reeks | +6 | |
| H | 0111 | +7 | +7 | +7 | |
| I | 1000 | -8 | -7 | -0 | |
| J | 1001 | -7 | = inverse van 7 + 1-bit | -6 | -1 |
| K | 1010 | -6 | = inverse van 6 + 1-bit | -5 | -2 |
| L | 1011 | -5 | = inverse van 5 + 1-bit | -4 | -3 |
| M | 1100 | -4 | = inverse van 4 + 1-bit | -3 | -4 |
| N | 1101 | -3 | = inverse van 3 + 1-bit | -2 | -5 |
| O | 1110 | -2 | = inverse van 2 + 1-bit | -1 | -6 |
| P | 1111 | -1 | = inverse van 1 + 1-bit | -0 | -7 |
Hoe krijg ik een binaire representatie van een geheel getal in de 2-complementmethode?
- Positieve getallen worden op dezelfde manier weergegeven als de methode met gehele getallen met teken
- Negatieve getallen worden weergegeven door elk bit van het corresponderende positieve getal om te keren en er vervolgens 1 bit aan toe te voegen
1) Eén representatie van nul:
Nu hebben we slechts één representatie van nul en die stelt ons in staat om op te slaan totaal 16 unieke waarden (+0 tot +7 en -1 tot -8).
2) Ondertekende extensie werkt voor negatieve getallen:
Ondertekende extensie werkt perfect voor negatieve getallen.
| Decimale | 4-bits | 5-bit | 6-bits |
| +2 | 0010 | 00010 | 000010 |
| +7 | 0111 | 00111 | 000111 |
| -2 | 1110 | 11110 | 111110 |
| -7 | 1001 | 11001 | 111001 |
3) Binaire optelling:
| Binair | Decimale | Binair | Decimale | Binair | Decimale | Binair | Decimale | ||||
| Nummer 1 | 0010 | +2 | 0111 | +7 | 1011 | -5 | 1111 | -1 | |||
| Nummer 2 | 1110 | -2 | 1110 | -2 | 0011 | +3 | 1010 | -6 | |||
| Antwoord | 0000 | +0 | 0101 | +5 | 1110 | -2 | 1001 | -7 |
4) Het eerste bit is een ondertekend bit:
Het complement van 2 heeft de mooie eigenschap dat het eerste bit een tekenbit is, omdat alle positieve bits met 0 beginnen, terwijl alle negatieve met 1 beginnen.
5) Controle van geheugenoverloop:
Tijdens het optellen hebben we ervoor gezorgd dat ons antwoord binnen het bereik ligt, maar tijdens het ontwerpen van hardware moet geheugenoverloop worden gedetecteerd. Het zal een zeer slecht idee zijn voor hardwareontwerpers om de omvang te controleren om overflow op te vangen. 2’s complementmethode biedt een zeer eenvoudige manier om geheugenoverloop te detecteren. I Als de overdracht naar een ondertekende bit niet gelijk is aan de uitvoering van een ondertekende bit, is er sprake van geheugenoverloop dat wil zeggen, als de carry-in naar het ondertekende bit 0 is maar de carry 1 is, of als de carry-in 1 maar de carry 0 is, dan is er sprake van geheugenoverflow.
| Binair | Decimale | Binair | Decimale | Binair | Decimale | Binair | Decimale | ||||
| Nummer 1 | 1011 | -5 | 0010 | 2 | 0111 | +7 | 1011 | -5 | |||
| Nummer 2 | 1100 | -4 | 0110 | 6 | 1110 | -2 | 0011 | 3 | |||
| Toevoeging | (1) 0111 | (0)1000 | (1)0101 | wat xd betekent | (0)1110 | ||||||
| binnenbrengen om te ondertekenen | 0 | overloop | 1 | overloop | 1 | Nee | 0 | Nee | |||
| uitvoeren om bit te ondertekenen | 1 | 0 | 1 | 0 |