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.

3-bitars 2-komplement

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

redigera

Ett 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

redigera

Exemplen 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
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

redigera

Eftersom 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

redigera

Representationssystemet har fått sitt namn från att  

Se även

redigera