Tilläggskod

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 31 januari 2021; kontroller kräver 22 redigeringar .

Tvås komplement ( ibland  " tvåkomplement " ) är det vanligaste sättet att representera negativa heltal i datorer . Det låter dig ersätta operationen för subtraktion med operationen av addition och göra operationerna för addition och subtraktion lika för tecken med och utan tecken, vilket förenklar datorarkitekturen . I engelsk litteratur kallas den " omvända koden " för " enornas komplement" och den "tilläggskoden" kallas " tvåkomplementet" .  

En ytterligare kod för ett negativt tal kan erhållas genom att invertera dess binära modul och lägga till en till inversionen, eller subtrahera talet från noll.
De tvås komplementkod definieras som det värde som erhålls genom att subtrahera talet från den största potensen av två (av 2 N för N-bitars sekunds komplement).

Tvås komplementrepresentation av ett negativt tal

När du skriver ett nummer i en tilläggskod är den viktigaste biten ett tecken. Om värdet på den mest signifikanta biten är 0, betyder det att de återstående bitarna innehåller ett positivt binärt tal som matchar den direkta koden .

Ett tvåkomplement förtecknat 8-bitars binärt tal kan representera vilket heltal som helst mellan −128 och +127 . Om den mest signifikanta biten är noll, är det största heltal som kan skrivas i de återstående 7 bitarna .

Exempel:

Decimal
representation
Binär representation (8 bitar), kod:
hetero tillbaka ytterligare
127        0111 1111        0111 1111        0111 1111       
ett        0000 0001        0000 0001        0000 0001       
0        0000 0000        0000 0000        0000 0000       
-0        1000 0000        1111 1111       
-ett        1000 0001        1111 1110        1111 1111       
-2        1000 0010        1111 1101        1111 1110       
-3        1000 0011        1111 1100        1111 1101       
-fyra        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       
-åtta        1000 1000        1111 0111        1111 1000       
-9        1000 1001        1111 0110        1111 0111       
-tio        1000 1010        1111 0101        1111 0110       
-elva        1000 1011        1111 0100        1111 0101       
-127        1111 1111        1000 0000        1000 0001       
-128        ---        ---        1000 0000       

Tilläggskod i ett annat nummersystem

Samma princip kan också användas i datorrepresentation av vilket talsystem som helst , till exempel för decimaltal .

Transformationer på exemplet med decimaltalssystemet [1]

Positivt tal

Värdet på de aktuella siffrorna i numret ändras inte, men den mest signifikanta siffran för tecknet läggs till, vars värde är 0. Till exempel kommer talet [+12'345] att ha följande representation - [012'345 ]

Negativt tal

Vi lägger till ett tecken senior siffra lika med den största siffran i detta talsystem , i vårt fall är det 9, och ändrar även de återstående siffrorna enligt en viss regel; låt värdet på siffran för varje siffra representeras av variabeln x , förutom tecknet ett, föreställ dig sedan följande algoritm för åtgärder:

  1. Tilldela variabeln x ett nytt värde lika med uttrycket 9 - x (processen att erhålla den omvända koden) - till exempel kommer ett negativt tal [ -12345 ] i direktkoden från den mest signifikanta till den minst signifikanta siffran att se ut som [9' 12345 ], där 9 är en teckensiffra, och i omvänd representation av koden kommer att se ut så här - [9'87654].
  2. Vi lägger till 1 till det resulterande talet, så talet [9'87654] (första tillägget) kommer att se ut som [987'655] (tilläggskod).
  3. Om en bitöverföringssituation uppstod, som ett resultat av vilken en ny bit bildades, utelämnar vi den (den högsta biten) och anser att det resulterande talet är positivt. Det resulterande positiva talet kommer att representeras lika, både i direkt och tvås komplementkod. Till exempel, med förmågan att representera negativa och positiva noll i denna form, låt oss analysera deras översättning till en extra kod (1 tecken och 4 ytterligare siffror):
    • [+0] i direktkod [0'0000]. Det första och andra komplementet är [0'0000].
    • [-0] i direktkod [9'0000]. Det första tillägget är [9'9999]. När det andra komplementet tas emot, utelämnas den höga biten av talet [(1)0'0000] och det resulterande värdet [0'0000] erhålls, som i talet [+0].

Idén att representera ett decimaltal (liksom alla andra) i tvås komplementkod är identisk med reglerna för det binära talsystemet och kan användas i en hypotetisk processor:

Vanlig

prestanda

Hetero

koden

Först

tillägg

Andra

tillägg

... ... ... ...
+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
-ett 9'0001 9'9998 9'9999
-2 9'0002 9'9997 9'9998
-3 9'0003 9'9996 9'9997
-fyra 9'0004 9'9995 9'9996
... ... ... ...
-9 9'0009 9'9990 9'9991
-tio 9'0010 9'9989 9'9990
-elva 9'0011 9'9988 9'9989
-12 9'0012 9'9987 9'9988
-13 9'0013 9'9986 9'9987

Tvås komplementaritmetik

Addition och subtraktion

Båda talen är representerade i tvås komplement. Den kompletterande koden för båda siffrorna har samma antal siffror. I denna representation läggs siffrorna till.

Tecknen är olika: Om en siffra som går utöver de initiala siffrorna under additionen bildas, så utelämnas den. Det resulterande värdet anses vara positivt där direkt- och tvåans komplementkod är identiska. Annars negativ i form av en tilläggskod .

Till exempel:

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

Tecknen är desamma:

  • positiva siffror. Urladdningen faller inte, resultatet är positivt.
  • Negativa tal. Siffran utelämnas, resultatet är negativt i de tvås komplementkod.

Till exempel:

  • [1234] + [78] → [0'1234] + [0'0078] = [0'1312] = [1312].
  • [-1234] + [-78] → [9'8766] + [9'9922] = [(1)9'8688] → (första komplementet) [0'1311] → (andra komplementet eller vanlig representation) [0 '1312]. När det översätts från tvås komplement till normal representation är det resulterande värdet absolut.

Konvertera till tvåkomplement

Omvandlingen av ett nummer från en direktkod till en ytterligare en utförs enligt följande algoritm.

  1. Om den mest signifikanta (tecken)biten av talet som skrivits i den direkta koden är 0, så är talet positivt och inga transformationer görs;
  2. Om den mest signifikanta (tecken) siffran i talet som skrivits i direktkoden är 1, då är talet negativt, alla siffror i numret, förutom tecknet, inverteras och 1 läggs till i resultatet.

Exempel. Låt oss konvertera det negativa talet −5, skrivet i direktkoden, till en extra kod. Direktkod för ett negativt tal -5:

1000 0101

Vi inverterar alla siffror i talet, förutom tecknet, och erhåller på så sätt den inversa koden (första tillägget) av ett negativt tal -5:

1111 1010

Låt oss lägga till 1 till resultatet och på så sätt få tilläggskoden (andra komplementet) av det negativa talet -5:

1111 1011

En liknande algoritm används för att omvandla det negativa talet -5 skrivet i de tvås komplementkod till det positiva talet 5 skrivet i den direkta koden. Nämligen:

1111 1011

Vi inverterar alla siffror i det negativa talet -5 och får på så sätt ett positivt tal 4 i direktkoden:

0000 0100

Lägger vi till 1 till resultatet får vi ett positivt nummer 5 i direktkod:

0101

Och kolla genom att lägga till med ytterligare kod

0000 0101 + 1111 1011 = 0000 0000, femte och högre siffror kasseras.

p-adiska nummer

I systemet med p -adiska tal utförs ändring av tecknet för ett tal genom att konvertera talet till dess tilläggskod. Till exempel, om talsystemet är 5, då är motsatsen till 0001 5 (1 10 ) 4444 5 (−1 10 ).

Implementering av de tvås komplementkonverteringsalgoritm (för 8-bitars nummer)

Pascal

om ( a < 0 ) a := (( inte a ) eller 128 ) + 1 ;

C/C++

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

Fördelar och nackdelar

Fördelar

  • Allmänna (processor) instruktioner för addition, subtraktion och vänsterförskjutning för signerade och osignerade tal (skillnader endast i aritmetiska flaggor som behöver kontrolleras för att kontrollera överflöde i resultatet).
  • Frånvaron av siffran " minus noll ".

Nackdelar

  • Representationen av ett negativt tal läses inte visuellt enligt de vanliga reglerna; dess uppfattning kräver en speciell skicklighet eller ytterligare beräkningar för att få det till en normal form.
  • I vissa representationer (som BCD ) eller deras beståndsdelar (som mantissan för ett flyttal ), är den extra kodningen obekväm.
  • Modulen för det största talet är inte lika med modulen för det minsta talet. Till exempel, för ett åttabitars heltal med tecken är det maximala antalet 127 10 = 01111111 2 , det lägsta antalet är -128 10 = 10000000 2 . Följaktligen finns det inte en motsats för något nummer. Skyltändringsoperationen kan kräva ytterligare verifiering.

Exempel på programmatisk konvertering

Om du läser data från en fil eller ett minnesområde där det är lagrat i två komplement (till exempel en WAVE-fil), kan det vara nödvändigt att konvertera byte. Om data lagras i 8 bitar måste värdena 128-255 vara negativa.

C# .NET / C stil

byte b1 = 254 ; //11111110 (binär) byte b2 = 121 ; //01111001 (binär) byte c = 1 <<( storlek på ( byte )* 8 - 1 ); //2 höjs till potensen 7. Resultat: 10000000 (binär) byte b1Conversion =( c ^ b1 ) - c ; //Resultat: -2. Och faktiskt en binär tvås komplementkod. byte b2Conversion =( c ^ b2 ) - c ; //Resultatet förblir 121 eftersom teckenbiten är noll.

Teckenförlängning

Sign extension (eng. Sign extension ) - en operation på ett binärt tal som låter dig öka antalet bitar samtidigt som tecknet och värdet bibehålls. Det utförs genom att lägga till siffror från den mest signifikanta siffran. Om siffran är positiv (den mest signifikanta siffran är 0) läggs nollor till, om den är negativ (den mest signifikanta siffran är 1) läggs ettor till.

Exempel

Decimal nummer binärt tal

(8 siffror)

binärt tal

(16 siffror)

tio 0000 1010 0000 0000 0000 1010
−15 1111 0001 1111 1111 1111 0001

Se även

Litteratur

  • Behrooz Parhami. 2.3. Komplettera representation, 2.4. Två- och 1-komplementtal // Datoraritmetik: Algoritmer och hårdvarudesigner . - New York: Oxford University Press, 2000. - S. 22-27. — 510p. — ISBN 0-19-512583-5 .
  • Samofalov K.G., Romankevich A.M., Valuysky V.N., Kanevsky Yu.S., Pinevich M.M. Tillämpad teori om digitala automater. - K . : Vishcha-skolan, 1987. - 375 sid.

Länkar

  1. Florida Tech . Hämtad 28 november 2020. Arkiverad från originalet 8 oktober 2016.