Ekstra kode

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 31. januar 2021; checks kræver 22 redigeringer .

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).

Tos komplementrepræsentation af et negativt tal

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       

Yderligere kode i et andet talsystem

Det samme princip kan også bruges i computerrepræsentationen af ​​ethvert talsystem , f.eks. for decimaltal .

Transformationer på eksemplet med decimaltalsystemet [1]

Positivt tal

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 tal

Vi 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:

  1. Tildel variablen x en ny værdi lig med udtrykket 9 - x (processen med at opnå den omvendte kode) - for eksempel vil et negativt tal [ -12345 ] i den direkte kode fra det mest signifikante til det mindst signifikante ciffer se ud [9' 12345 ], hvor 9 er et tegnciffer, og i omvendt repræsentation af koden vil se sådan ud - [9'87654].
  2. Vi tilføjer 1 til det resulterende tal, så tallet [9'87654] (første tilføjelse) vil se ud som [987'655] (ekstra kode).
  3. Hvis der opstod en bitoverførselssituation, som et resultat af hvilken en ny bit blev dannet, udelader vi den (den højeste bit) og betragter det resulterende tal som positivt. Det resulterende positive tal vil være ligeligt repræsenteret, både i direkte og tos komplementkode. Hvis vi for eksempel har evnen til at repræsentere negativt og positivt nul i denne form, så lad os analysere deres oversættelse til en ekstra kode (1 tegn og 4 ekstra cifre):
    • [+0] i direkte kode [0'0000]. Det første og andet komplement er [0'0000].
    • [-0] i direkte kode [9'0000]. Den første tilføjelse er [9'9999]. Når det andet komplement modtages, udelades den høje bit af tallet [(1)0'0000], og den resulterende værdi [0'0000] opnås, som i tallet [+0].

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

Tos komplementaritmetik

Addition og subtraktion

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:

  • [1234] + [-78] → [0'1234] + [9'9922] = [(1)0'1156] = [1156].
  • [-1234] + [78] → [9'8766] + [0'0078] = [9'8844] = [-1156].

Tegnene er de samme:

  • positive tal. Udledningen falder ikke, resultatet er positivt.
  • Negative tal. Cifferet er udeladt, resultatet er negativt i de tos komplementkode.

For eksempel:

  • [1234] + [78] → [0'1234] + [0'0078] = [0'1312] = [1312].
  • [-1234] + [-78] → [9'8766] + [9'9922] = [(1)9'8688] → (første komplement) [0'1311] → (andet komplement eller regulær repræsentation) [0 '1312]. Når den oversættes fra tos komplement til normal repræsentation, er den resulterende værdi absolut.

Konvertering til to-komplement

Konverteringen af ​​et tal fra en direkte kode til en yderligere udføres i henhold til følgende algoritme.

  1. Hvis den mest signifikante (tegn)bit af tallet skrevet i den direkte kode er 0, så er tallet positivt, og der udføres ingen transformationer;
  2. Hvis det mest signifikante (tegn)ciffer i tallet skrevet i den direkte kode er 1, så er tallet negativt, alle cifre i tallet, bortset fra tegnet, inverteres , og 1 tilføjes til resultatet.

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 0101

Vi 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 1010

Lad os tilføje 1 til resultatet, og dermed få den ekstra kode (andet komplement) af det negative tal -5:

1111 1011

En 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 1011

Vi inverterer alle cifre i det negative tal -5 og opnår således et positivt tal 4 i direkte kode:

0000 0100

Tilføjer vi 1 til resultatet, får vi et positivt tal 5 i direkte kode:

0101

Og tjek ved at tilføje med ekstra kode

0000 0101 + 1111 1011 = 0000 0000, femte og højere cifre kasseres.

p-adiske tal

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 ).

Implementering af de tos komplementkonverteringsalgoritme (for 8-bit tal)

Pascal

hvis ( a < 0 ) a := (( ikke a ) eller 128 ) + 1 ;

C/C++

int convert ( int a ) { hvis ( a < 0 ) a = ~ ( -a ) + 1 ; _ returnere en ; }

Fordele og ulemper

Fordele

  • Generelle (processor) instruktioner til addition, subtraktion og venstreforskydning for tal med fortegn og usignerede tal (kun forskelle i aritmetiske flag, der skal kontrolleres for at kontrollere overløb i resultatet).
  • Fraværet af tallet " minus nul ".

Ulemper

  • Repræsentationen af ​​et negativt tal læses ikke visuelt i henhold til de sædvanlige regler; dets opfattelse kræver en særlig færdighed eller yderligere beregninger for at bringe det i en normal form.
  • I nogle repræsentationer (såsom BCD ) eller deres komponentdele (såsom mantissen af ​​et flydende kommatal ), er den ekstra kodning ubelejlig.
  • Modulet for det største tal er ikke lig med modulet for det mindste tal. For et otte-bit heltal med fortegn er det maksimale antal f.eks. 127 10 = 01111111 2 , det mindste antal er -128 10 = 10000000 2 . Derfor er der ikke for noget tal en modsætning. Skiltændringsoperationen kan kræve yderligere verifikation.

Eksempel på programmatisk konvertering

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.

C# .NET / C stil

byte b1 = 254 ; //11111110 (binær) byte b2 = 121 ; //01111001 (binær) byte c = 1 <<( størrelsen af ​​( byte )* 8 - 1 ); //2 hæves til potensen 7. Resultat: 10000000 (binær) byte b1Conversion =( c ^ b1 ) - c ; //Resultat: -2. Og faktisk en binær to-komplementkode. byte b2Conversion =( c ^ b2 ) - c ; //Resultatet forbliver 121, fordi fortegnsbitten er nul.

Tegnudvidelse

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.

Eksempel

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

Se også

Litteratur

  • Behrooz Parhami. 2.3. Supplerende repræsentation, 2.4. To'er- og 1'er-komplementtal // Computeraritmetik: Algoritmer og hardwaredesign . - New York: Oxford University Press, 2000. - S. 22-27. - 510 sider. — ISBN 0-19-512583-5 .
  • Samofalov K.G., Romankevich A.M., Valuysky V.N., Kanevsky Yu.S., Pinevich M.M. Anvendt teori om digitale automater. - K . : Vishcha skole, 1987. - 375 s.

Links

  1. Florida Tech . Hentet 28. november 2020. Arkiveret fra originalen 8. oktober 2016.