Omvandla mellan unsigned och signed

Ange ett värde, som unsigned eller signed, inom begränsningarna för antalet bitar. Verktyget kommer sedan att beräkna motsvarande värde enligt reglerna för tvåkomplement.

bitar

Heltal lagras i en dator som en serie av ett fast antal bitar (ettor och nollor). Det vanligaste är att 8, 16, 32 eller 64 bitar används. Bitarna kan tolkas på två olika sätt. Antingen tolkas de som ett tal utan tecken vilket betyder att inga negativa värden kan förekomma, eller så tolkas de som ett tal med tecken och då kan både positiva och negativa värden förekomma, men inte lika stora.

Tal utan tecken (unsigned)

Eftersom datorns minne endast består av ettor och nollor är det mest naturligt att tolka datan enligt det binära talsystemet. För ett n-bitars tal ger det 2^n olika värden, men eftersom räkningen börjar från noll betyder det att det högsta möjliga värdet är 2^n - 1.

Värdet för en enskild bit i ett binärt tal är 2^b där b är bitens position, räknat från höger till vänster, med start från noll. Värdet av ett binärt tal kan således beräknas genom att addera värdet för varje bit.

Det binära talet 1011 kan beräknas enligt följande:

1 0 1 1
1·2^3 + 0·2^2 + 1·2^1 + 1·2^0 =
8 + 0 + 2 + 1 = 11

Avsaknaden av tecken (+/−) gör det omöjligt att representera negativa tal. I datorsammanhang brukar detta sättet att hantera tal på kallas för unsigned.

Tal med tecken (signed)

För att representera tal med tecken brukar den mest signifikanta biten (den längst till vänster) användas för att signalera om talet är negativt. Det är därför viktigt att ha klart för sig hur många bitar som används, och att alltid skriva ut alla bitar för att klart och tydligt kunna se vilket värde teckenbiten har.

Positiva tal (inklusive noll) hanteras på samma sätt som för tal utan tecken men eftersom en bit faller bort halveras antalet positiva tal och därför blir det högsta möjliga värdet för ett n-bitars tal 2^n-1 - 1.

Ett naivt sätt att hantera de negativa talen är att notera om teckenbiten är 1, vilket betyder att talet är negativt, och sedan tolka resterande bitar som vanligt.

1 0 1 1
 −  ( 0·2^2 + 1·2^1 + 1·2^0 ) =
 −  ( 0 + 2 + 1 ) = −3

En oönskad effekt av detta är att det ger två olika bitmönster som kodar för noll (±0), och det komplicerar även för hur vissa beräkningar utförs. För att demonstrera problematiken adderas här de två negativa 4-bitars talen -3 och -2 enligt de vanliga aritmetiska reglerna för binära tal.

1011  ( −3 )
+ 1010  ( −2 )
0101  ( +5 )  ✗Fel

Egentligen skulle det binära resultatet vara 10101 men eftersom vi har begränsat oss till 4-bitar faller den extra ettan bort. Som du kan se får resultatet fel tecken. Att hantera detta är relativt enkelt. Allt som behövs är en extra regel som säger att om teckenbiten är 1 i båda talen så skall det även vara 1 i resultatet, men som vi ska se så blir det mer komplicerat när två tal med olika tecken adderas.

1011  ( −3 )
+ 0010  ( +2 )
1101  ( −5 )  ✗Fel

Här blir resultatet helt fel. Det går naturligtvis att lägga till ytterligare regler för hur beräkningen ska ske i olika situationer men det skulle leda till onödig komplexitet och dyrare datorer. Detta sättet att hantera negativa tal förekommer visserligen ibland (t.ex. i flyttal) men för heltal används nästan uteslutande något som kallas för tvåkomplementsform eftersom det på ett relativt enkelt sätt löser de problem som har nämnts här.

Tvåkomplementsform

Det minsta värdet för ett n-bitars tal på tvåkomplementsform är -2^n-1. Bitmönstret för detta tal är en etta (teckenbit=1) följt av n-1 nollor. För ett 4-bitars tal innebär det att det minsta värdet är -8 och lagras som 1000.

Resterande negativa tal är ordnade så att närmsta större tal fås genom att utföra en vanlig binär addition med 1. För ett 4-bitars tal används alltså 1001 för att koda -7, 1010 för att koda -6, och så vidare, ända upp till 1111 som kodar för -1.

Om man fortsätter på samma sätt och adderar 1 med 1111 ger det 10000, men eftersom bara 4 bitar används faller ettan bort och kvar blir 0000 som kodar för 0. Resterande positiva tal följer på samma sätt. Att gå från minsta till största värde kan alltså göras med samma beräkning utan att hantera negativa tal annorlunda.

Att representera talen på det här viset medför att addition, subtraktion och multiplikation kan utföras av datorn på samma sätt oavsett om vi arbetar med tecken (signed) eller utan tecken (unsigned). Om de felaktiga beräkningarna som gjordes tidigare görs om på samma sätt som förut men med de negativa talen skrivna på tvåkomplementsform kommer det att ge rätt resultat.

1101  ( −3 )
+ 1110  ( −2 )
1011  ( −5 )  ✓Rätt
1101  ( −3 )
+ 0010  ( +2 )
1111  ( −1 )  ✓Rätt

Lägg märke till att det enda som skiljer mot tidigare är vilka bitmönster som kodar för vilka tal. Sättet som talen adderas på har inte förändrats.

För att få fram tvåkomplementsformen av ett negativt tal kan man först skriva talet som ett positivt binärt tal, sedan invertera bitarna, och slutligen utföra en addition med 1.

För att demonstrera hur det går till kommer -3 att skrivas på tvåkomplementsform med 4 bitar. Först noteras att talet 3 skrivs binärt som 0011. När bitarna sedan inverteras fås 1100. Sista steget för att få fram tvåkomplementsformen är att addera 1 vilket ger 1101. Detta innebär att 1101 är tvåkomplementsformen för -3

Omvänd beräkning, d.v.s. att från tvåkomplementsformen beräkna vilket värde som motsvaras, kan göras på samma sätt. Om 1101 först inverteras och sedan adderas med 1 ger det tillbaka 0011 som kodar för 3. Slutsatsen blir därför att 1101 kodar för -3.