Tvåkomplementsform är ett sätt att representera negativa tal med det binära talsystemet. Då utnyttjas den mest signifikanta biten för att markera talets tecken (signerad aritmetik). En förutsättning för att det här skall fungera är att man använder fast ordlängd.
I systemet finns bara en 0:a (andra representationer kan ha två), närmaste högre tal fås genom addition med 1 till den minst signifikanta biten (LSB) och invertering av tal sker genom bitvis invertering av alla bitar följt av en addition med 1 i LSB.
Definition
redigeraEtt maskintal, det vill säga de tal som exempelvis datorn räknar med, mellan -1 och 1 med n bitar:
motsvarar det verkliga talet
Exempel
redigeraExemplen nedan använder en ordlängd på 8 bitar.
Representation | Decimalt | Hexadecimalt | Binärt |
---|---|---|---|
Osignerad | 0 - 255 | 0x00 - 0xFF | 00000000 - 11111111 |
Signerad | -128 - 127 | 0x80 - 0x7F | 10000000 - 01111111 |
För att ändra ett tvåkomplementtals tecken inverteras först bitmönstret och sedan adderas 1.
Exempel:
Ursprungligt | Decimalt | Inverterat | Plus 1 | Decimalt |
---|---|---|---|---|
00000001 | 1 | 11111110 | 11111111 | -1 |
11111111 | -1 | 00000000 | 00000001 | 1 |
10101010 | -86 | 01010101 | 01010110 | 86 |
00000000 | 0 | 11111111 | 00000000 | 0¹ |
10000000 | -128 | 01111111 | 10000000 | -128² |
¹ Talet noll 0 har inget tecken och operationen är verkningslös!
² Här är bara teckenbiten satt och talet har inget värde.
Ett sätt att se omvandlingen från binärt till decimalt för negativa tal, är att omvandla det binära talet enligt den vanliga teckenlösa konverteringen, och om talet är större än 127, dra från 256. För att omvandla från decimalt till binärt, lägg till 256 om talet är negativt och omvandla till binärt teckenlöst. Exempel:
Binärt | Decimalt teckenlöst | Dra av 256 |
---|---|---|
10000000 | 128 | -128 |
11111111 | 255 | -1 |
Användning i datorer
redigeraEftersom binära talrepresentationer är vanliga i datorer används tvåkomplement oftast i begränsad precision, det vill säga att ett tal består av högst stycken bitar. Detta gör att man inte kan hantera hur stora eller precisa tal som helst och man låter de binära talen representera tal mellan -1 och 1.
Att tvåkomplementsform kräver fast ordlängd kan vara en av datorernas största akilleshälar. För att göra en operation på två tal med olika ordlängd eller representation krävs att man typomvandlar det ena först och sådant tar tid. I C och C++ görs typomvandlingen vanligtvis automatiskt till den större typen men man kan tvinga den till valfri typ med en explicit typomvandling.
I detta system är talet positivt om den mest signifikanta biten är 0 och negativt om den är 1. Vid addition och subtraktion sker inga oegentligheter när 0:an passeras (carry-flaggan kan försummas), men när talomfånget överskrids inträffar spill, vilket gör att addition av två positiva tal kan ge ett negativt tal som summa (då ettställs spillflaggan). Detta händer om rätt summa är större än det största positiva talet, t.ex. 127 för 8-bitstal.
Etymologi
redigeraRepresentationssystemet har fått sitt namn från att