To-komplement ( nogle gange " toer - komplement" ) er den mest almindelige måde at repræsentere negative heltal på i computere . Det giver dig mulighed for at erstatte operationen med subtraktion med operationen af addition og gøre operationerne for addition og subtraktion ens for tal med fortegn og uden fortegn , hvilket forenkler computerarkitekturen . I engelsk litteratur kaldes den "omvendte kode" for " en -komplementet" , og "tillægskoden" kaldes "to - komplementet" .
En ekstra kode for et negativt tal kan opnås ved at invertere dets binære modul og lægge en til inversionen eller trække tallet fra nul.
De tos komplementkode er defineret som værdien opnået ved at trække tallet fra den største potens af to (ud af 2 N for N-bit sekunds komplement).
Når du skriver et tal i en ekstra kode, er den vigtigste bit et tegn. Hvis værdien af den mest signifikante bit er 0, betyder det, at de resterende bits indeholder et positivt binært tal , der matcher den direkte kode .
Et 8-bit binært tal med to komplement fortegn kan repræsentere et hvilket som helst heltal mellem -128 og +127 . Hvis den mest signifikante bit er nul, så er det største heltal, der kan skrives i de resterende 7 bit .
Eksempler:
Decimalrepræsentation _ |
Binær repræsentation (8 bit), kode: | ||
---|---|---|---|
lige | tilbage | ekstra | |
127 | 0111 1111 | 0111 1111 | 0111 1111 |
en | 0000 0001 | 0000 0001 | 0000 0001 |
0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | |
-en | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-fire | 1000 0100 | 1111 1011 | 1111 1100 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
-6 | 1000 0110 | 1111 1001 | 1111 1010 |
-7 | 1000 0111 | 1111 1000 | 1111 1001 |
-otte | 1000 1000 | 1111 0111 | 1111 1000 |
-9 | 1000 1001 | 1111 0110 | 1111 0111 |
-ti | 1000 1010 | 1111 0101 | 1111 0110 |
-elleve | 1000 1011 | 1111 0100 | 1111 0101 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | --- | --- | 1000 0000 |
Det samme princip kan også bruges i computerrepræsentationen af ethvert talsystem , f.eks. for decimaltal .
Værdien af de aktuelle cifre i tallet ændres ikke, men det fortegns vigtigste ciffer tilføjes, hvis værdi er 0. For eksempel vil tallet [+12'345] have følgende repræsentation - [012'345 ]
Negativt talVi tilføjer et fortegn seniorciffer svarende til det største ciffer i dette talsystem , i vores tilfælde er det 9, og ændrer også de resterende cifre i henhold til en bestemt regel; lad værdien af cifferet for hvert ciffer repræsenteres af variablen x undtagen fortegnet en, og forestil dig derefter følgende handlingsalgoritme:
Ideen om at repræsentere et decimaltal (såvel som ethvert andet) tal i tos komplementkode er identisk med reglerne for det binære talsystem og kan bruges i en hypotetisk processor:
Vaneligt
ydeevne |
Lige
koden |
Først
tilføjelse |
Sekund
tilføjelse |
---|---|---|---|
... | ... | ... | ... |
+13 | 0'0013 | 0'0013 | 0'0013 |
+12 | 0'0012 | 0'0012 | 0'0012 |
+11 | 0'0011 | 0'0011 | 0'0011 |
+10 | 0'0010 | 0'0010 | 0'0010 |
+9 | 0'0009 | 0'0009 | 0'0009 |
+8 | 0'0008 | 0'0008 | 0'0008 |
... | ... | ... | ... |
+2 | 0'0002 | 0'0002 | 0'0002 |
+1 | 0'0001 | 0'0001 | 0'0001 |
+0 | 0'0000 | 0'0000 | 0'0000 |
-0 | 9.0000 | 9'9999 | 0'0000 |
-en | 9'0001 | 9'9998 | 9'9999 |
-2 | 9'0002 | 9'9997 | 9'9998 |
-3 | 9'0003 | 9'9996 | 9'9997 |
-fire | 9'0004 | 9'9995 | 9'9996 |
... | ... | ... | ... |
-9 | 9'0009 | 9'9990 | 9'9991 |
-ti | 9'0010 | 9'9989 | 9'9990 |
-elleve | 9'0011 | 9'9988 | 9'9989 |
-12 | 9'0012 | 9'9987 | 9'9988 |
-13 | 9'0013 | 9'9986 | 9'9987 |
Begge tal er repræsenteret i to's komplement. Den komplementære kode for begge numre har det samme antal cifre. I denne fremstilling tilføjes tallene.
Tegnene er forskellige: Hvis der i processen med tilføjelse dannes et ciffer, der går ud over de indledende tal, så udelades det. Den resulterende værdi betragtes som positiv , hvor den direkte og to's komplementkode er identiske. Ellers negativ i form af en ekstra kode .
For eksempel:
Tegnene er de samme:
For eksempel:
Konverteringen af et tal fra en direkte kode til en yderligere udføres i henhold til følgende algoritme.
Eksempel. Lad os konvertere det negative tal −5, skrevet i den direkte kode, til en ekstra kode. Direkte kode for et negativt tal -5:
1000 0101Vi inverterer alle cifre i tallet, undtagen tegnet, og opnår således den inverse kode (første tilføjelse) af et negativt tal -5:
1111 1010Lad os tilføje 1 til resultatet, og dermed få den ekstra kode (andet komplement) af det negative tal -5:
1111 1011En lignende algoritme bruges til at konvertere det negative tal -5 skrevet i de tos komplementkode til det positive tal 5 skrevet i den direkte kode. Nemlig:
1111 1011Vi inverterer alle cifre i det negative tal -5 og opnår således et positivt tal 4 i direkte kode:
0000 0100Tilføjer vi 1 til resultatet, får vi et positivt tal 5 i direkte kode:
0101Og tjek ved at tilføje med ekstra kode
0000 0101 + 1111 1011 = 0000 0000, femte og højere cifre kasseres.I systemet med p -adiske tal udføres ændring af fortegnet for et tal ved at konvertere tallet til dets ekstra kode. For eksempel, hvis talsystemet er 5, så er det modsatte af 0001 5 (1 10 ) 4444 5 (−1 10 ).
Hvis du læser data fra en fil eller et hukommelsesområde, hvor det er gemt i to's komplement (for eksempel en WAVE-fil), kan det være nødvendigt at konvertere bytes. Hvis dataene er gemt i 8 bit, skal værdierne 128-255 være negative.
Tegnforlængelse (eng. Tegnforlængelse ) - en operation på et binært tal, der giver dig mulighed for at øge antallet af bits, samtidig med at tegnet og værdien bevares. Det udføres ved at tilføje cifre fra det mest signifikante ciffer. Hvis tallet er positivt (det mest signifikante ciffer er 0), tilføjes nuller; hvis det er negativt (det mest betydende ciffer er 1), tilføjes et.
Decimaltal | binært tal
(8 cifre) |
binært tal
(16 cifre) |
---|---|---|
ti | 0000 1010 | 0000 0000 0000 1010 |
−15 | 1111 0001 | 1111 1111 1111 0001 |