Tvåkomplementsform
Från Rilpedia
Tvåkomplementsform är ett sätt att representera negativa tal (minus) 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.
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 så 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.
Att tvåkomplementsform kräver fast ordlängd kan vara en av datorenas största akilleshälar. För att göra en operation på två tal med olika ordlängd eller representation så krävs det 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.