Der er tre forskellige måder at repræsentere signeret heltal (artikel) på. a: Signeret bit, b: 1's komplement og c: 2's komplement. Lad os prøve at forstå, hvordan disse metoder er udledt, og hvorfor 2's komplement foretrækkes frem for andre.
Som vi ved, lagres data i bits. Hvordan kan vi gemme signeret heltal i hukommelsen? For at løse dette problem vil vi først udvikle en naiv løsning og derefter gentage den, indtil vi har den bedste løsning på vores problem.
a) Signeret bit
Når du forsøger at gemme et signeret heltal, virker det oplagt at reservere den venstre bit til fortegn og bruge resterende bits til faktisk at gemme værdierne. For eksempel: i 4-bit system vil den første bit fra venstre være reserveret til fortegn (0 repræsenterer positiv, mens 1 repræsenterer negativ), og andre 3 bits vil blive brugt til at gemme værdierne. På samme måde i 8-bit system, vil den første bit fra venstre blive brugt til fortegn, og de resterende 7 vil blive brugt til værdier.
Mr. Nej. | Binær repræsentation | Decimalværdi |
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 |
Jminimax algoritme | 1001 | -1 |
K | 1010 | -2 |
L | 1011 | -3 |
M | 1100 | -4 |
N | 1101 | -5 |
O | 1110 | -6 |
P | 1111 | -7 |
Ved at bruge denne tilgang er vi med succes i stand til at repræsentere signeret heltal. Men når vi analyserer det nærmere, kan vi observere følgende ulemper:
1) To repræsentationer af nul:
I 4-bit system burde vi være i stand til at gemme 16 (24) værdier, men +1 til +7 og -1 til -7 er kun 14 værdier. Hvor er de resterende to værdier? Når vi observerer tabellen omhyggeligt, vil vi finde ud af, at disse to værdier konvergerer til 0. Vi har således to repræsentationer af nul, det vil sige en repræsentation for +0 og en anden for -0.
Men er to repræsentationer af 0 en stor bekymring? Og hvad så? I stedet for 16 unikke værdier kan vi kun gemme 15 værdier. Vi har råd til at reducere rækkevidden med 1, er det ikke? For softwareudvikleren bekymrer det måske ikke, men for en kredsløbsdesigner kan det være meget frustrerende først at kontrollere, om værdien er +0, og derefter kontrollere, om den er -0.
2) Signeret forlængelse virker ikke for negative tal:
Størrelsen af data stiger hurtigt. Nogen tid skal vi udvide bitsystemet, så vi kan øge rækkevidden af data, der kan lagres. I 2014 overskred Gangnam Style-video YouTubes visningsgrænse, og det tvang YouTube til at opgradere antallet af visninger fra 32-bit til 64-bit signeret heltal. Tilsvarende vil 32-bit Unix-uret flyde over den 19. januar 2038, fordi det registrerer tid i sekunder i et 32-bit signeret heltal.
Så det er lige så vigtigt, at vores repræsentationssystem let kan udvides, hvilket ikke er muligt med dette repræsentationssystem.
Decimal | 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 addition virker ikke:
Lad os prøve at tilføje to binære tal:
Binær | Decimal | Binær | Decimal | Binær | Decimal | |||
Nummer 1 | 0010 | +2 | 0111 | +7 | 1101 | -5 | ||
Nummer-2 | 1010 | -2 | 1010 | -2 | 0011 | +3 | ||
Binær addition | 1100 | -4 | 0001 | +1 | 0000 | +0 | ||
Decimal tilføjelse | +0 | +5 | -2 |
Hvorfor virker en simpel binær addition ikke her? Årsagen er, at fortegnsbitten (mest venstre) ikke er en almindelig bit og ikke en del af det faktiske tal. Forestil dig situationen, hvor man skal designe hardwarekredsløbet til at ignorere fortegnsbitten for at udføre addition og derefter tilføje fortegnsbitten.
Så dette var en naiv måde at repræsentere signeret heltal. Hovedproblemet med denne tilgang er, at vi har kortlagt negative tal ned og op. Hvis vi ændrer vores kortlægningssystem til top-down dem, vil nogle af ovenstående problemer blive løst.
b) 1's Co mplement
Hvis vi omformer vores negative tal fra top-down, vil vi få følgende binære tabel:
Ja Nej. | Binær repræsentation | Decimalværdi | |
1’s komplement | Signeret 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år man binær repræsentation af et heltal i 1’s komplementmetode?
- Positive tal er repræsenteret svarende til fortegnsheltalsmetoden
- Negative tal repræsenteres ved at invertere hver bit af det tilsvarende positive tal (invertering kan nemt udføres ved at bruge NOT gate under hardwaredesign)
Lad os analysere dette nøje for at se, om vi har opnået nogle forbedringer.
1) To repræsentationer af nul:
I denne tilgang har vi også to repræsentationer af nul.
2) Signeret forlængelse virker ikke for negative tal:
Signeret forlængelse fungerer perfekt til negative tal.
Decimal | 4-bit | 5-bit | 6-bit |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1101 | 11101 | 111101sammenligne strenge java |
-7 | 1000 | 11000 | 111000 |
3) Binær addition fungerer med modificerede regler:
Binær | Decimal | Binær | Decimal | Binær | Decimal | |||
Nummer 1 | 0010 | +2 | 0111 | +7 | 1010 | -5 | ||
Nummer-2 | 1101 | -2 | 1101 | -2 | 0011 | +3 | ||
Binær addition | 1111 | -0 | 0100 | +4 | 1101 | -2 | ||
Decimal tilføjelse | +0 | +5 | -2 |
Svaret er ikke altid korrekt, men det er meget tæt på det rigtige svar. Vi kan få det til at fungere, hvis vi følger reglen hvis du har genereret fremføring på din mest venstre bit, så smid den ikke væk i stedet for at bringe den tilbage og tilføje den til den højre bit.
Binær | Decimal | Binær | Decimal | Binær | Decimal | |||
Nummer 1 | 0111 | +7 | 1110 | -1 | 0111 | +7 | ||
Nummer-2 | 1101 | -2 | 1001 | -6 | 1011 | -4 | ||
Binær addition | (1) 0100 | +4 | (1) 0111 | +7 | (1) 0010 | +2 | ||
Tilføjer bære fremad tilbage | 0101 | +5 | 1000 | -7 | 0011 | +3 |
Absolut 1's komplementmetode er bedre end signeret bit. Vores største bekymringer er løst, men problemet er fortsat (med to repræsentationer af nul), og vores hack i binær addition giver ledetråde til at forbedre 1's komplementmetode. Lad os omformulere disse sætninger for at gøre det nemmere.
- Vi har en ekstra repræsentation af nul, hvilket er unødvendigt
- Mens addition af to binære tal, hvis vi har en fremføring i den venstre bit, så skal vi tilføje +1 til resultatet, dvs. det rigtige svar kan findes ved at gå ned til næste række i den binære tabel.
Begge fortæller os, at en ekstra repræsentation af nul er årsagen til problemet. Så lad os fjerne dette ekstra nul og flytte alle negative værdier til næste række (-7 vil flytte fra I -> J, -6 vil flytte fra J -> K og så videre...)
c) 2's komplement
Når vi fjerner -0 fra 1'erens komplementtabel og flytter alle negative værdier en række nedenunder, får vi følgende tabel, som kaldes 2's komplement:
Ja Nej. | Binær repræsentation | Decimalværdi | |||
2’s komplement | 1’s komplement | Signeret 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 af 7 + 1-bit | -6 | -1 |
K | 1010 | -6 | = invers af 6 + 1-bit | -5 | -2 |
L | 1011 | -5 | = invers af 5 + 1-bit | -4 | -3 |
M | 1100 | -4 | = invers af 4 + 1-bit | -3 | -4 |
N | 1101 | -3 | = invers af 3 + 1-bit | -2 | -5 |
O | 1110 | -2 | = invers af 2 + 1-bit | -1 | -6 |
P | 1111 | -1 | = invers af 1 + 1-bit | -0 | -7 |
Hvordan får man binær repræsentation af et heltal i 2's komplementmetode?
- Positive tal er repræsenteret svarende til fortegnsheltalsmetoden
- Negative tal repræsenteres ved at invertere hver bit af det tilsvarende positive tal og derefter tilføje 1 bit til det
1) En repræsentation af nul:
Nu har vi kun én repræsentation af nul, og det giver os mulighed for at gemme i alt 16 unikke værdier (+0 til +7 og -1 til -8).
2) Signeret forlængelse fungerer for negative tal:
Signeret forlængelse fungerer perfekt til negative tal.
Decimal | 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 addition:
Binær | Decimal | Binær | Decimal | Binær | Decimal | Binær | Decimal | ||||
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 fortegnsbit:
2's komplement har denne fine egenskab, at første bit er en tegnbit, fordi alle positive starter med 0, mens alle negative med 1.
5) Kontrol af hukommelsesoverløb:
Mens vi tilføjede, sørgede vi for, at vores svar er inden for rækkevidden, men under design af hardware skal hukommelsesoverløb registreres. Det vil være en meget dårlig idé for hardwaredesignere at kontrollere størrelsen for at fange overløb. 2s komplementmetode giver en meget enkel måde at registrere hukommelsesoverløb. jeg f. indførsel til fortegnsbit ikke er lig med udførelse af fortegnsbit, så er der tale om hukommelsesoverløb dvs., hvis indfør til signeret bit er 0, men udførelse er 1, eller hvis indfør 1, men udførelse er 0, så er der tale om hukommelsesoverløb.
Binær | Decimal | Binær | Decimal | Binær | Decimal | Binær | Decimal | ||||
Nummer 1 | 1011 | -5 | java programmer | 0010 | 2 | 0111 | +7 | 1011 | -5 | ||
Nummer-2 | 1100 | -4 | 0110 | 6 | 1110 | -2 | 0011 | 3 | |||
Tilføjelse | (1) 0111 | (0)1000 | (1)0101 | (0)1110 | |||||||
bære ind for at underskrive bit | 0 | flyde over | 1 | flyde over | 1 | Ingen | 0 | Ingen | |||
udføre for at underskrive bit | 1 | 0 | 1 | 0 |