Det er tre forskjellige måter å representere signert heltall (artikkel) på. a: Signert bit, b: 1s komplement og c: 2s komplement. La oss prøve å forstå hvordan disse metodene har utledet og hvorfor 2s komplement foretrekkes fremfor andre.
Som vi vet at data lagres i biter. Hvordan kan vi lagre signert heltall i minnet? For å løse dette problemet vil vi først utvikle en naiv løsning og deretter gjenta den til vi har den beste løsningen for problemet vårt.
a) Signert bit
Når du prøver å lagre et signert heltall, virker det opplagt å reservere den venstre biten for tegn og bruke gjenværende biter for å faktisk lagre verdiene. For eksempel: i 4-bits system vil første bit fra venstre være reservert for fortegn (0 representerer positivt mens 1 representerer negativt) og andre 3 biter vil bli brukt til å lagre verdiene. Tilsvarende i et 8-bits system vil første bit fra venstre brukes til fortegn og de resterende 7 vil bli brukt til verdier.
Mr. Nei. | Binær representasjon | Desimalverdi |
EN | 0000 | +0 |
B | 0001 | +1 |
C | 0010 | +2 |
D | 0011 | +3 |
OG | 0100 | +4 |
F | 0101 | +5 |
G | 0110 | +6 |
H | 0111 | +7 |
Jeg | 1000 | -0 |
Jsnu strengen i java | 1001 | -1 |
K | 1010 | -2 |
L | 1011 | -3 |
M | 1100 | -4 |
N | 1101 | -5 |
O | 1110 | -6 |
P | 1111 | -7 |
Ved å bruke denne tilnærmingen er vi i stand til å representere fortegnet heltall. Men når vi analyserer det nærmere, kan vi observere følgende ulemper:
1) To representasjoner av null:
I 4-bits system skal vi kunne lagre 16 (24) verdier, men +1 til +7 og -1 til -7 er bare 14 verdier. Hvor er de to gjenværende verdiene? Når vi observerer tabellen nøye, vil vi finne ut at disse to verdiene konvergerer til 0. Dermed har vi to representasjoner av null, det vil si en representasjon for +0 og en annen for -0.
Men er to representasjoner av 0 en stor bekymring? Hva så? I stedet for 16 unike verdier, kan vi bare lagre 15 verdier. Vi har råd til å redusere rekkevidden med 1, er det ikke? For programvareutvikleren er det kanskje ikke bekymret, men for en kretsdesigner kan det være veldig frustrerende å først sjekke om verdien er +0 og deretter sjekke om den er -0.
2) Signert utvidelse fungerer ikke for negative tall:
Størrelsen på dataene øker raskt. Litt tid trenger vi å utvide bitsystemet slik at vi kan øke omfanget av data som kan lagres. I 2014 overskred Gangnam Style-videoen YouTube-visningsgrensen, og den tvang YouTube til å oppgradere antall visninger fra 32-biters til 64-biters signert heltall. På samme måte vil 32-bits Unix-klokke flyte over 19. januar 2038 fordi den registrerer tid i sekunder i et 32-bits heltall med fortegn.
Så det er like viktig at vårt representasjonssystem lett kan utvides, noe som ikke er mulig med dette representasjonssystemet.
Desimal | 4-bit | 5-bit | 6-bit |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1010 | 10010 (!= 11010) | 100010 (!= 111010) |
-7 | 1111 | 10111 (!= 11111) | 100111 (!= 111111) |
3) Binær tillegg fungerer ikke:
La oss prøve å legge til to binære tall:
Binær | Desimal | Binær | Desimal | Binær | Desimal | |||
Nummer-1 | 0010 | +2 | 0111 | +7 | 1101 | -5 | ||
Nummer 2 | 1010 | -2 | 1010 | -2 | 0011 | +3 | ||
Binær tillegg | 1100 | -4 | 0001 | +1 | 0000 | +0 | ||
Desimal tillegg | +0 | +5 | -2 |
Hvorfor fungerer ikke et enkelt binært tillegg her? Årsaken er at fortegnsbiten (mest til venstre) ikke er en vanlig bit og ikke en del av faktisk tall. Se for deg situasjonen der man må designe maskinvarekretsene for å ignorere fortegnsbiten for å utføre addisjon og deretter legge til fortegnsbiten.
Så dette var en naiv måte å representere signert heltall på. Hovedproblemet med denne tilnærmingen er at vi har kartlagt negative tall ned og opp. Hvis vi endrer kartleggingssystemet vårt til toppen og ned, vil noen av problemene ovenfor bli løst.
b) 1's Co mplement
Hvis vi tilordner de negative tallene våre ovenfra og ned, får vi følgende binære tabell:
Ja Nei. | Binær representasjon | Desimalverdi | |
1s komplement | Signert bit | ||
EN | 0000 | +0 | +0 |
B | 0001 | +1 | +1 |
C | 0010 | +2 | +2 |
D | 0011 | +3 | +3 |
OG | 0100 | +4 | +4 |
F | 0101 | +5 | +5 |
G | 0110 | +6 | +6 |
H | 0111 | +7 | +7 |
Jeg | 1000 | -7 | -0 |
J | 1001 | -6 | -1 |
K | 1010 | -5 | -2 |
L | 1011 | -4 | -3 |
M | 1100 | -3 | -4 |
N | 1101 | -2 | -5 |
O | 1110 | -1 | -6 |
P | 1111 | -0 | -7 |
Hvordan få binær representasjon av et heltall i 1s komplementmetode?
- Positive tall er representert på samme måte som heltallsmetoden med fortegn
- Negative tall er representert ved å invertere hver bit av tilsvarende positivt tall (invertering kan enkelt gjøres ved å bruke NOT gate under maskinvaredesign)
La oss analysere dette nøye for å se om vi har oppnådd noen forbedringer.
1) To representasjoner av null:
I denne tilnærmingen har vi også to representasjoner av null.
2) Signert utvidelse fungerer ikke for negative tall:
Signert utvidelse fungerer perfekt for negative tall.
Desimal | 4-bit | 5-bit | 6-bit |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1101 | 11101 | 111101minimaks algoritme |
-7 | 1000 | 11000 | 111 000 |
3) Binær addisjon fungerer med modifiserte regler:
Binær | Desimal | Binær | Desimal | Binær | Desimal | |||
Nummer-1 | 0010 | +2 | 0111 | +7 | 1010 | -5 | ||
Nummer 2 | 1101 | -2 | 1101 | -2 | 0011 | +3 | ||
Binær tillegg | 1111 | -0 | 0100 | +4 | 1101 | -2 | ||
Desimal tillegg | +0 | +5 | -2 |
Svaret er ikke alltid riktig, men det er veldig nær det riktige svaret. Vi kan få det til å fungere hvis vi følger regelen som hvis du har generert fremføring på den venstre delen, så ikke kast den i stedet for å ta den tilbake og legg den til den til høyre.
Binær | Desimal | Binær | Desimal | Binær | Desimal | |||
Nummer-1 | 0111 | +7 | 1110 | -1 | 0111 | +7 | ||
Nummer 2 | 1101 | -2 | 1001 | -6 | 1011 | -4 | ||
Binær tillegg | (1) 0100 | +4 | (1) 0111 | +7 | (1) 0010 | +2 | ||
Legger til fremføring tilbake | 0101 | +5 | 1000 | -7 | 0011 | +3 |
Definitivt 1s komplementmetode er bedre enn signert bit. Våre største bekymringer er løst, men problemet er fortsatt (med to representasjoner av null) og hacket vårt i binær tillegg gir ledetråder for å forbedre 1s komplementmetode. La oss omformulere disse setningene for å gjøre det enklere.
- Vi har en ekstra representasjon av null som er unødvendig
- Mens addisjon av to binære tall, hvis vi har en fremføring i venstre bit, må vi legge til +1 til resultatet, dvs. det riktige svaret kan bli funnet ved å gå ned til neste rad i den binære tabellen.
Begge forteller oss at en ekstra representasjon av null er hovedårsaken til problemet. Så la oss fjerne denne ekstra nullen og flytte alle negative verdier til neste rad (-7 vil flytte fra I -> J, -6 vil flytte fra J -> K og så videre...)
c) 2s komplement
Når vi fjerner -0 fra 1-komplementtabellen og flytter alle negative verdier en rad under, får vi følgende tabell som kalles 2-komplement:
Ja Nei. | Binær representasjon | Desimalverdi | |||
2s komplement | 1s komplement | Signert bit | |||
EN | 0000 | +0 | +0 | +0 | |
B | 0001 | +1 | +1 | +1 | |
C | 0010 | +2 | +2 | +2 | |
D | 0011 | +3 | +3 | +3 | |
OG | 0100 | +4 | +4 | +4 | |
F | 0101 | +5 | +5 | +5 | |
G | 0110 | +6 | +6 | +6 | |
H | 0111 | +7 | +7 | +7 | |
Jeg | 1000 | -8 | -7 | -0 | |
J | 1001 | -7 | = invers av 7 + 1-bit | -6 | -1 |
K | 1010 | -6 | = invers av 6 + 1-bit | -5 | -2 |
L | 1011 | -5 | = invers av 5 + 1-bit | -4 | -3 |
M | 1100 | -4 | = invers av 4 + 1-bit | -3 | -4 |
N | 1101 | -3 | = invers av 3 + 1-bit | -2 | -5 |
O | 1110 | -2 | = invers av 2 + 1-bit | -1 | -6 |
P | 1111 | -1 | = invers av 1 + 1-bit | -0 | -7 |
Hvordan få binær representasjon av et heltall i 2s komplementmetode?
- Positive tall er representert på samme måte som heltallsmetoden med fortegn
- Negative tall er representert ved å invertere hver bit av tilsvarende positivt tall og deretter legge til 1 bit til det
1) En representasjon av null:
Nå har vi bare én representasjon av null, og den lar oss lagre totalt 16 unike verdier (+0 til +7 og -1 til -8).
2) Signert utvidelse fungerer for negative tall:
Signert utvidelse fungerer perfekt for negative tall.
Desimal | 4-bit | 5-bit | 6-bit |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1110 | 11110 | 111110 |
-7 | 1001 | 11001 | 111001 |
3) Binær tillegg:
Binær | Desimal | Binær | Desimal | Binær | Desimal | Binær | Desimal | ||||
Nummer-1 | 0010 | +2 | 0111 | +7 | 1011 | -5 | 1111 | -1 | |||
Nummer 2 | 1110 | -2 | 1110 | -2 | 0011 | +3 | 1010 | -6 | |||
Svar | 0000 | +0 | 0101 | +5 | 1110 | -2 | 1001 | -7 |
4) Første bit er en signert bit:
2s komplement har denne fine egenskapen at første bit er en tegnbit fordi alle positive starter med 0 mens alle negative med 1.
5) Minneoverløpskontroll:
Mens vi gjorde tillegg, sørget vi for at svaret vårt er innenfor rekkevidden, men mens vi designer maskinvare, må minneoverløp oppdages. Det vil være en veldig dårlig idé for maskinvaredesignere å sjekke størrelsen for å fange overløp. 2s komplementmetode gir en veldig enkel måte å oppdage minneoverløp. Jeg f innføring til signert bit er ikke lik å bære ut av signert bit, så er det tilfelle av minneoverflyt dvs. hvis innføring til signert bit er 0, men utføring er 1, eller hvis innføring er 1, men utføring er 0, er det et tilfelle av minneoverflyt.
Binær | Desimal | Binær | Desimal | Binær | Desimal | Binær | Desimal | ||||
Nummer-1 | 1011 | -5 | java pgm | 0010 | 2 | 0111 | +7 | 1011 | -5 | ||
Nummer 2 | 1100 | -4 | 0110 | 6 | 1110 | -2 | 0011 | 3 | |||
Addisjon | (1) 0111 | (0)1000 | (1)0101 | (0)1110 | |||||||
bære inn for å signere bit | 0 | flyte | 1 | flyte | 1 | Nei | 0 | Nei | |||
utføre for å signere bit | 1 | 0 | 1 | 0 |