Talkonverteringar
När vi skriver program för mikrokontroller måste vi vanligtvis hantera tre olika talsystem: decimaltal, binärtal och hexadecimaltal (eller hex). Vi använder decimalsystem eftersom det kommer naturligt; det är så vi räknar. Tyvärr är det inte så datorer räknar. Eftersom datorer och mikrokontroller är begränsade till 1:or och 0:or räknar de med hjälp av sekvenser av dessa tal. Detta är det binära talsystemet. Binära tal föregås vanligen av tecknen ”0b” som inte ingår i talet. Ibland är de också indelade i grupper om 4 siffror för att göra dem lättare att läsa och lättare att relatera till det hexadecimala talsystemet. Ett exempel på ett binärt tal är 0b0100.1011. Punkterna i talet representerar ingenting, de gör det bara lättare att läsa talet.
Det binära systemet är enkelt att förstå, men det krävs många siffror för att använda det binära systemet för att representera stora tal. Det hexadecimala systemet kan representera mycket större tal med hjälp av färre tecken, och det påminner mycket om binära tal. Hexadecimala tal föregås vanligen av tecknen ”0x” som inte är en del av talet. En enda hexadecimal siffra kan representera fyra binära siffror!
Binära siffror kan endast bestå av 1:or och 0:or; vanligtvis består ett binärt tal av 8 siffror (eller någon multipel av 8) om det används i någon form av dator (eller mikrokontroller). Det är användbart att veta hur man omvandlar ett binärt tal till ett decimaltal och vice versa. Hur konverterar man då mellan olika talsystem? Tänk först på hur vi bestämmer värdet på ett decimaltal. Talet 268 kan delas upp som 200 + 60 + 8, eller 2 * (10^2) + 6 * (10^1) + 8 * (10^0). Det finns två viktiga siffror som vi måste känna till för att ”dekonstruera” talet – basen i talsystemet och siffrans placering i talet. Basen för ett decimaltal är 10. När vi omvandlar talet 268 är 2 den andra siffran, 6 den första siffran och 8 nollsiffran. Varje siffra måste skalas enligt sin plats i talet. Siffrans skala är talsystemets bas upphöjd till potensen av siffrans plats i talet. Så varje siffra skalas, och sedan adderas alla skalade siffror för att hitta talets totala värde.
Samma metod kan användas för att hitta värdet av ett binärt tal. Låt oss till exempel titta på talet 0b1011.0101. Basen i det binära systemet är 2 (prefixet 0b används ofta i kod för att ange att talet är i binärt format). Värdet på vårt tal är: 1*(2^7)+0*(2^6)+1*(2^5)+1*(2^4)+0*(2^3)+1*(2^2)+0*(2^1)+1*(2^0), vilket är lika med 181.
0b1011.0101. Vilket fullständigt ineffektivt sätt att skriva ett tal! Men vi kan representera samma binära tal med hjälp av endast 2 hexadecimala siffror. Först börjar vi dock med att konvertera ett hexadecimalt (hex) tal till decimaltal på samma sätt som vi gjorde för ett binärt tal. Vad sägs om 0xB5? Vänta, vad?! Prefixet 0x används i koden för att ange att talet skrivs i hexadekvat. Men vad gör ”B” där inne? Det hexadecimala formatet har en bas på 16, vilket innebär att varje siffra kan representera upp till 16 olika värden. Tyvärr tar siffrorna slut efter ”9”, så vi börjar använda bokstäver. Bokstaven ”A” representerar 10, ”B” är 11, ”C” är 12, ”D” är 13, ”E” är 14 och ”F” är 15. ”F” är den största siffran i det hexagonala siffersystemet. Vi omvandlar siffran på samma sätt som tidigare. Värdet av 0xB5 är alltså: B*(16^1)+5*(16^0) eller 181.
Det är viktigt att veta hur man konverterar binärt och hex till decimaltal, men den mest användbara sifferkonverteringen är förmodligen att konvertera mellan hex och binärt. Dessa två siffersystem fungerar faktiskt ganska bra tillsammans. Nummersystemen råkar vara besläktade på så sätt att en enda hexsiffra representerar exakt 4 binära siffror, och att 2 hexsiffror kan alltså representera 8 bitar (eller binära siffror). Här är en tabell som visar hur varje hexadiktad siffra är relaterad till det binära systemet:
Binary Value | Hex Value |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
Till exempel, för att konvertera hexatalet 0x1C till binärt tal skulle vi hitta motsvarande binära värde för 1 och C och kombinera dem. Så 0x1C i binär form är 0b0001.1100. Om vi vill ta reda på hex-värdet för ett binärt tal går vi bara åt andra hållet. För att hitta hexadeklarationen för det binära talet 0b0010.1011 hittar vi först hexadeklarationen för 0010, sedan hexadeklarationen för 1011 och kombinerar dem; hexadeklarationen skulle bli 0x2B.
Det finns många kostnadsfria verktyg tillgängliga för att hjälpa till att konvertera mellan dessa siffersystem, det är bara att googla ”hex number conversion”. Om du använder Windows som operativsystem har du ett bra verktyg inbyggt i miniräknaren. Ändra bara miniräknaren till vetenskapligt läge så kan du konvertera mellan talsystem genom att skriva in ett tal och sedan ändra formatet på miniräknaren!