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).
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 |
Samma princip kan också användas i datorrepresentation av vilket talsystem som helst , till exempel för decimaltal .
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 talVi 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:
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 |
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:
Tecknen är desamma:
Till exempel:
Omvandlingen av ett nummer från en direktkod till en ytterligare en utförs enligt följande algoritm.
Exempel. Låt oss konvertera det negativa talet −5, skrivet i direktkoden, till en extra kod. Direktkod för ett negativt tal -5:
1000 0101Vi 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 1010Låt oss lägga till 1 till resultatet och på så sätt få tilläggskoden (andra komplementet) av det negativa talet -5:
1111 1011En 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 1011Vi inverterar alla siffror i det negativa talet -5 och får på så sätt ett positivt tal 4 i direktkoden:
0000 0100Lägger vi till 1 till resultatet får vi ett positivt nummer 5 i direktkod:
0101Och kolla genom att lägga till med ytterligare kod
0000 0101 + 1111 1011 = 0000 0000, femte och högre siffror kasseras.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 ).
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.
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.
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 |