Binär representation av negativa heltal: tecken, magnitud och tvåkomplement
Representationer av tecknade tal används för att lösa problemet med att representera negativa heltal i binär form. Problemet med att försöka lagra det negativa tecknet (-) i ett binärt tal är att det inte finns några tillstånd kvar att använda för att representera den negativa tilldelningen. Det är inte möjligt att bara använda "off" för minus och "on" för plus eftersom datorn inte skulle ha något sätt att veta om det är en siffra eller ett tecken.
För att lösa detta problem uppfann datorkonstruktörer två metoder för att lagra negativa binära tal: tecken och magnitud och tvåkomplement. Dessa metoder ger alternativa representationer för tecknade tal.
Varför problemet uppstår
I binär representation finns varje bit bara i två tillstånd (0 eller 1). Om man försöker lägga till ett separat "teckenbit"-koncept måste man göra tydligt vilka bitar som är själva talet och vilken som anger tecken. Utan en etablerad konvention blir talens tolkning tvetydig och aritmetik komplicerad. Olika representationer försöker balansera läsbarhet, enkelhet vid aritmetik och utnyttjande av de möjliga bitmönstren.
Tecken och magnitud (sign-and-magnitude)
I denna enkla metod används den mest signifikanta biten (MSB) som teckenbit: 0 betyder positivt och 1 betyder negativt. De återstående bitarna ger magnitude (storleken) i vanlig binär form.
Exempel med 4 bitar:
- 0001 = +1
- 1001 = -1
- 0111 = +7
- 1111 = -7
- 0000 = +0 och 1000 = -0 (två representationer av noll)
Fördelar: intuitiv och lätt att tolka för människor. Nackdelar: finns två olika nollvärden (positiv och negativ noll) och aritmetik (särskilt addition och subtraktion) blir mer komplicerad eftersom tecknet måste hanteras separat.
Tvåkomplement (two's complement)
Tvåkomplement är den mest använda representationen i moderna datorer. Här representeras negativa tal genom att invertera bitarna i det positiva talet (ettkomplement) och sedan lägga till 1. Resultatet blir en unik binärsträng för varje heltal.
Hur man bildar tvåkomplement för ett negativt tal (med n bitar):
- Skriv talets absoluta värde i binärt med n bitar.
- Invertéra alla bitarna (byt 0 ↔ 1).
- Lägg till 1 till det inverterade värdet.
Alternativt: ett negativt tal -x i tvåkomplement = 2^n − x (tolkat som ett värde i n bitar).
Exempel med 4 bitar:
- +3 = 0011
- -3: invertera 0011 → 1100, lägg till 1 → 1101 (så -3 = 1101)
- Range för 4 bitar: -8 ... +7 (alltså -2^{n-1} ... 2^{n-1}-1)
Fördelar: unik nollrepresentation (endast 0000), förenklad hårdvaruimplementation för addition och subtraktion (samme krets som för osignerade tal i många fall), och aritmetik fungerar naturligt med binär addition där överföringsbit kan ignoreras. Nackdelar: asymmetrisk interval (minsta negativa tal har ingen positiv motsvarighet, t.ex. i 4 bitars tvåkomplement finns -8 men ingen +8) och behov att tolka MSB som viktningsbit med negativ vikt istället för en ren teckenbit.
Hur man tolkar tvåkomplementvärden
Med n bitar kan du tolka ett tvåkomplementtal b_{n-1} b_{n-2} ... b_0 som:
värde = -b_{n-1}·2^{n-1} + Σ_{i=0}^{n-2} b_i·2^i
Det innebär att MSB fungerar som en negativ vikt när den är 1. Praktiskt tolkar man ofta: om MSB är 0 → talet är positivt (vanlig binär tolkning); om MSB är 1 → för att få det absoluta värdet inverterar man bitarna och lägger till 1.
Arimetisk och overflow
I tvåkomplement kan addition göras på samma sätt som vid osignerade tal. För overflow gäller följande enkla regel: om du lägger ihop två tal med samma tecken och resultatet får annat tecken, så har overflow inträffat. En annan hårdvarureglering är att titta på carry in och carry out till MSB — om dessa skiljer sig indikerar det overflow.
Exempel (4 bitar): 7 + 1 = 0111 + 0001 = 1000 → tolkat som -8 → overflow, eftersom 7 + 1 inte kan representeras i intervallet -8…+7 utan overflow.
Jämförelse och praktisk användning
- Tvåkomplement används i praktiken i nästan alla moderna datorarkitekturer tack vare enkelheten i hårdvaran för addition/subtraktion och unika noll.
- Tecken och magnitud kan vara enklare att förstå vid presentation eller i vissa specialfall, men är mindre effektiv för aritmetik i hårdvara.
- Ettkomplement (ones' complement) är en annan äldre metod som har två nollor och användes i vissa tidiga system, men den har i stort sett försvunnit till förmån för tvåkomplement.
Snabbguide: konverteringar
- Decimal → tvåkomplement (negativt tal): välj n bitar, skriv |x| i binärt, invertera, lägg till 1.
- Tvåkomplement → decimal: om MSB = 0, tolka normalt; om MSB = 1, invertera +1 för att få |x| och sätt minus framför.
- Negation i tvåkomplement: invertera alla bitar och lägg till 1 (samma procedur för att få -x).
Sammanfattningsvis ger både tecken och magnitud och tvåkomplement sätt att representera negativa heltal i binärt, men tvåkomplement är oftast att föredra i praktiska system tack vare sin effektivitet för aritmetik och entydiga nollvärde.
Tecken och magnitud
Sign and Magnitude fungerar genom att ändra den mest signifikanta biten (MSB - den första siffran) till en 1 om talet är negativt, och minska talet med ett, till exempel:
0000 0010 (2)
kommer att bli...
1000 0010 (-2)
Denna metod för att lagra negativa binära tal fungerar inte eftersom:
- Binär aritmetik fungerar inte.
- Vi måste först veta vilken lagringsmekanism kompilatorn för ett visst språk använder.
1-komplement
1:s komplement fungerar till exempel genom att byta ut 1:or mot 0:or och 0:or mot 1:or:
0000 0010 (2)
kommer att bli...
1111 1101 (-2)
Precis som med tecken- och magnitudmetoden kan detta enkelt definieras som ett negativt tal eftersom dess mest signifikanta bit är 1.
2:s komplement
Komplettering av tvåan är ett svårare sätt att lagra negativen. Det finns tre steg för det:
- Hitta det positiva binära talet (t.ex. 8base 10 = 0000 1000base 2).
- Byt ut 1:orna mot 0:or och 0:orna mot 1:or (t.ex. 0000 1000base 2 blir 1111 0111base 2).
Detta kallas att "vända på bitarna", eller att tillämpa logisk NOT på den ursprungliga bas 2-representationen.
- Lägg till 1 (t.ex. 1111 0111bas 2 + 1bas 2 = 1111 1000bas 2).
Den här metoden är populär eftersom:
- Det är som tecken och magnitud; ett negativt tal börjar med en 1 och ett positivt tal börjar med en 0.
- Den binära aritmetiken fungerar.
- Det finns bara ett värde för 0 (0000 0000bas 2).