English

Talsystem

De siffror och tal vi använder i vardagen brukar kallas decimala. Namnet kommer från latinets deci som betyder tio. Tio är just antalet siffror som vi kan använda för att skriva olika tal. Att det är just tio är en ren slump och hänger samman med antalet fingrar de flesta av oss har. I historien finner man flera kulturer som har valt att räkna på andra sätt. Maya-indianerna till exempel hade tjugo olika siffror och i Babylonien räknade man med basen sextio.

Decimala tal

Det här med att vi har tio siffror brukar kallas att vi har basen tio. I praktiken innebär detta att vi har de tio siffersymbolerna 0, 1, 2, 3, 4, 5, 6, 7, 8 och 9. Dessa använder vi för att skriva olika tal, som till exempel 4711. Talet 4711 består av fyra siffror. Dessa fyra siffrors placerig är av betydelse för hur talet utläses och hur mycket värdet av talet är. Skulle vi till exempel byta plats på siffrorna och istället skriva 7141 så skulle det bli ett annat tal med ett annat värde. Detta beror på att själva platsen som siffran står på har ett värde i sig. Sjuan i 4711 är inte bara en sjua. Platsen den står på gör att den i själva verket är värd 700.

Man brukar prata om ental, tiotal, hunratal och så vidare och i det decimala talsystemet skriver man entalen längst till höger. Närmast till vänster kommer tiotalen och så vidare. För varje position åt vänster man går multipliceras platsens värde med tio. Ettan i talet 100 är värd tio gånger mer än ettan i talet 10. Detta kan låta trivialt men det är viktigt att ha dessa fundamentala grunder klara för sig för att förstå hur de andra talsystemen fungerar. Det är dessutom ingen självklarhet att det ska vara på det sättet. I den gamla egyptiska matematiken hade symbolernas position ingen betydelse, lika så i rommerska tal.

Binära tal

I en dator är allt ettor och nollor brukar man säga. Detta beror på att man i datorsammanhang, eller egentligen främst inom elektroniken, använder sig av det binära talsystemet. I det binära talsystemet är basen 2, man har alltså endast två siffror, 0 och 1. En siffra i ett binärt tal brukar kallas för en bit och representerar den minsta enhet som kan lagra någon information. Precis som i det decimala talsystemet så sätter man den minst värda siffran längst till höger och den mest värda längst till vänster. Dessa brukar kallas LSB (Least Significant Bit - Den minst värda biten) och MSB (Most Significant Bit).

Att basen är två innebär att för varje steg åt vänster man går i ett binärt tal så multipliceras bitens värde med två. Positionen längst till höger (LSB) är värd 1, positionen till vänster om denna är värd 2. Fortsätter man åt vänster så dubblas värdet för varje position, 4, 8, 16, 32 och så vidare. Ettan i det binära talet 100 är alltså värd två gånger mer än ettan i det binära talet 10.

När man vill räkna om ett binärt tal till ett decimalt tal så gör man på exakt samma sätt som när man räknar ut värdet av ett decimalt tal. Värdet av det decimala talet 42 är 4*10 + 2*1 = 42 därför att tvåans position är värd ett och fyrans position är värd tio gånger mer (då basen är tio). Motsvarande binära tal skulle bli 101010 eftersom 1*32 + 0*16 + 1*8 + 0*4 + 1*2 + 0*1 = 42. Tabellen nedan visar några godtyckliga binära tal.

Positionens värde
3216 8 4 2 1 Decimalt
10111147
00101111
01000117

Det binära talsystemet saknar det minustecken som finns i det decimala talsystemet för att tala om att ett tal är negativt. I stället använder man sig av något som kallas tvåkomplement. I kort kan man beskriva det som att man räknar baklänges från 0. -1 blir då talet där alla bitar är 1. För att skilja på positiva och negativa tal säger man att alla tal där MSB är ett ska vara negativa. Om vi begränsar oss till åtta bitar får vi alltså -1 = 11111111. -2 blir 11111110, -3 = 11111101, -4 = 11111100 och så vidare ner till 10000000 som blir -128. Nästa lägre tal, 01111111, blir 127 - positivt eftersom MSB = 0. Med dessa åtta bitar kan vi alltså lagra tal från -128 till 127. Detta brukar kallas för en signed byte.

Som ni kanske lagt märke till så handlar det enbart om heltal när man pratar om binära tal. Flyttal är ganska krångliga att representera då man saknar decimaltecknet i det binära talsystemet, så det går jag inte in på nu.

Åtta bitar räcker inte så långt i dagens datorer, idag är det inte ovanligt med 32- och 64-bitars tal. Principen är exakt den samma för dessa tal och de blir därför väldigt stora, (vi dubblerar ju värdet för varje ny bit). 8 bitar ger 256 kombinationer, (0-255), nio bitar ger 512, tio ger 1.024 och så vidare. Sexton bitar ger tal från 0 till 65.535. Ett signerat 16-bitarstal kan representera heltal mellan -32.768 och 32.767. Fortsätter man uppåt märker man att talen växer fort för varje ny bit. Vid 24 bitar hamnar vi på tal mellan 0 och 16,8 miljoner. 32 bitar ger tal upp till 4,3 miljarder och 64 bitarstal som vi idag hittar i nyare datorer kan representera tal upp till 18.446.744.073.709.551.615 (jättestort!).

Hexadecimala tal

De hexadecimala talen är mycket vanliga när man programmerar. Till exempel adresser i datorns minne skrivs ofta hexadecimalt. Dessa har basen 16. Principerna är de samma som för de binära och decimala talsystemen. För att kunna använda basen 16 krävs dock 16 siffror och för att få det har man lånat in de sex första bokstäverna i alfabetet. A motsvarar då det decimala talet 10, b = 11, c = 12, d = 13, e = 14 och f = 15. Att översätta ett hexadecimalt tal till decimalt sker enligt samma mönster som tidigare: 2a = 2*16 + a*1 = 2*16 + 10*1 = 42. Det hexadecimala talet 2a har alltså vrdet 42 i det decimala talsystemet.

För att särskilja hexadecimala tal från decimala skriver man ofta ett prefix framför talet. 0x är ett vanligt prefix just i programmeringssammanhang (0x2a), # och $ är andra vanliga prefix. # är inte så vanlig i programmeringsspråk men används däremot i HTML för att beskriva färgkoder skrivna med hexadecimala tal.

En stor anledning till att just hexadecimala tal är så vanliga i datorsammanhang är att det är mycket enkelt att översätta mellan hexadecimalt och binärt. Varje siffra i ett hexadecimalt tal motsvaras av fyra bitar (siffror i det binära talet). Tvåan i talet 0x2a skrivs 10 binärt och a (tio) skrivs som 1010. Sätter man ihop dessa får man det binära talet 101010 = 42 decimalt. Ytterligare exempel ger en tydligare bild:

Positionens värde (för det hexadecimala talet))
4096256161Talet
Hexadecimalt12670x1267
Binärt00010010011001110001 0010 0110 0111
Decimalt----4711

Precis som de binära talen så saknar hexadecimala tal ett enkelt sätt att skriva negativa tal och decimaltal.

Nedan kan du experimentera själv och konvertera olika tal mellan de olika baserna. Förutom de tre baser vi diskuterat här konverterar programmet även till oktalt (bas åtta). Längst ner finns även möjligheten att skriva in en egen bas för att testa lite annat. Kanske testa att använda bas 60 som de gamla babylonierna gjorde. Det är där våra sextio minuter på en timma kommer ifrån.

Här skulle det vara en Java applet som konverterade mellan olika talbaser.