Redaktør:Håkon Tolsby
Læringsmål: Lære hvorfor datamaskinen er digital, hvordan data kan lagres som binære verdier ved hjelp av elektriske spenninger og hvordan man kan konvertere mellom ulike tallsystemer.
Innhold:
Sist oppdatert: 15. sept 2014
De aller fleste datamaskiner er digitale. Ordet digital stammer egentlig fra det latinske ordet "digitus" som betyr finger eller tå, men som også har den avledede betydningen "tall". Det engelske ordet "digit" har den samme opprinnelsen. Vi bruker ordet digital på alle objekter som bearbeider, inneholder eller viser data i form av adskilte (diskrete) verdier, for eksempel tallkoder.
I datamaskinene bruker vi strøm (eller mer eksakt spenning) til å representere data. Gjennom ledningene på databussen kan det enten sendes strøm eller ikke sende strøm. Vi kaller disse adskilte verdiene for biter og sier at verdien til en bit kan være 0 (ikke strøm) eller 1 (strøm). Tallsystemet med kun to tall kaller vi for det binære tallsystemet, og det er det som brukes til å kode all data i datamaskinen
Fordelen med digitale maskiner er at de er meget stabile og nøyaktige. For eksempel er det vanlig å tolke alle spenninger mellom 2,0 volt og 5,0 volt som 1 (logisk høy), mens alle spenninger mellom 0 volt og 0,8 volt tolkes som 0 (logisk lav). Dermed er det stor sannsynlighet for at signalet skal bli tolket riktig selv om det skulle bli svekket av en komponent i datamaskinen
Man har også laget datamaskiner som ikke bruker adskilte verdier slik som det binære tallsystemet, til å representere data. Slike maskiner kalles for analoge datamaskiner. I stedet for tallkoder bruker disse maskinene egenskaper ved strømmen til å representere verdier. 3,89 volt kan for eksempel tilsvare 38,9 kg og 4,56 volt kan tilsvare 45,6 kg.
Ulempen med de analoge maskinene er at de er veldig ustabile og er derfor vanskelige å styre. En liten unøyaktighet i en elektrisk komponent er nok til at maskinen kan blande sammen verdiene 3,99 volt og 4,0 volt. Derfor er dette en lite brukt teknologi i datamaskiner.
En digital datamaskin skjønner ikke annet enn tallene 0 og 1 (strøm og ikke strøm). Tallsystemet med to tall kalles for det binære tallsystemet. Ulempen med dette tallsystemet er at tallene ofte blir lange og vanskelige å forstå. Derfor bruker man ofte det oktale og det heksadesimale tallsystemet i stedet for det binære.
Kunnskap om tall og tallsystemer er viktig for å forstå hvordan datamaskinen fungerer.
Det desimale tallsystemet eller titallsystemet (også kalt dekadisk), er det vi kjenner best og bruker daglig. Det består av sifrene 0 til 9. For hver ny posisjon blir verdien ti ganger høyere. Tenk for eksempel på tallene 10 og 100. Eneren i tredje posisjon (fra høyre) er ti ganger mer verdt enn eneren i andre posisjon.
318 = 3x102 + 1x101 + 8x100
Man må kjenne det binære tallsystemet for å forstå hvordan data lagres og aritmetiske operasjoner blir utført i en datamaskin.
Tallene i en mikroprosessor er representert med et spenningsnivå hvor en transistor enten blir slått av eller på, for eksempel:
0 volt = 0 binært, 5 volt = 1 binært
Det binære tallsystemet eller totallsystemet, består bare av sifrene 0 og 1.
02 = 010 12 = 110 102 = 210 112 = 310 1002 = 410 1012 = 510 1102 = 610 osv.
Det siste tallet kan regnes ut slik:
1102= 1*22 + 1*21 + 0*20 = 4 + 2 + 0 = 610
I en datamaskin benyttes åtte binære sifre for å representere ett tegn. Hvert binære siffer kaller vi en bit, mens åtte biter til sammen utgjør en byte. Med åtte biter og to variasjonsmuligheter (0 og 1) får vi totalt 256 variasjoner (28).
Et typisk binært tall vil være 8-, 16- eller 32-sifret.
Hva er 101101012 i desimaltallsystemet? Vi setter opp en tabell:
1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | |
27 | 26 | 25 | 24 | 23 | 22 | 1 | 20 | |
128 | +0 | +32 | +16 | +0 | +4 | +0 | +1 | = 181 |
Tabellen er bare et hjelpemiddel for å finne verdiene til posisjonene i binærtallsystemet. Med litt trening klarer du deg uten.
Metoden går ut på å dele tallet med to helt til det ikke går lenger. Det binære tallet finner du ved å sette sammen restverdien etter hver divisjon.
Vi skal gjøre om tallet 15610 til binær:
156 : 2 = 78 rest 0 minst signifikant 78 : 2 = 39 rest 0 39 : 2 = 19 rest 1 19 : 2 = 9 rest 1 9 : 2 = 4 rest 1 4 : 2 = 2 rest 0 2 : 2 = 1 rest 0 1 : 2 = 0 rest 1 mest signifikant svar = 10011100
Addisjon og subtraksjon i binærtallsystemet utføres på tilsvarende måte som i desimaltallsystemet. Pass på hva du har i mente, og hva du må låne:
01011001 10110111 + 01101101 - 01011101 = 11000110 = 01011010
Det heksadesimale tallsystemet ( 16-tallsystemet) består av tallene 0 til 9, samt A, B, C, D, E, og F. I dette tallsystemet har vi behov for 16 sifre. Derfor benyttes bokstavene A til F i tillegg til sifrene 0 til 9.
116 = 110 216 = 210 ...
916 = 910 A16 = 1010 B16 = 1110 C16 = 1210 D16 = 1310 E16 = 1410 F16 = 1510
I det heksadesimale tallsystemet blir sifrene 16 ganger mer verdt for hver ny posisjon.
Det er enkelt å gjøre om fra heksadeimale tall til binære og omvendt. Siden et heksadesimalt tall alltid vil bli mye "kortere" enn et binært, er det vanlig å benytte dette tallsystemet for å representere binære tall. Dette gjelder spesielt i assemblyprogrammering (maskinprogrammering).
0000 = 0 0100 = 4 1000 = 6 1100 = C 0001 = 1 0101 = 5 1001 = 9 1101 = D 0010 = 2 0110 = 6 1010 = A 1110 = E 0011 = 3 0111 = 7 1011 = B 1111 = F
OBS! 4 binære tall utgjør alltid et heksadesimalt og omvendt.
For å gjøre om tallet 1100 01002 til et heksadesimalt tall gjør du slik:
Grupper tallene i grupper på fire sifre fra høyre og beregn det heksadesimale tallet for hver gruppe. I vårt eksempel får du:
1100 0100 C 4 => C4
For å gjøre om tallet 1AF416 til et binært tall gjør du slik:
Start med tallet lengst til høre og skriv det på binær form med fire siffer. Fortsett med neste tall og skriv der på binær form med fire siffer. Gjenta operasjonen for alle sifrene (husk at hvert heksadesimale tall utgjør 4 sifre på binært). I vårt eksempel får du:
1 A F 4 0001 1010 1111 0100 => 0001101011110100
Metoden er den samme som du brukte for å gjøre om fra desimaltallsystemet til binærtallsystemet bare at du nå må dele med 16 i stedet for 2.
Vi skal gjøre om tallet 1036 til heks:
156 : 16 = 9 rest 12(=C) minst signifikant 9 : 16 = 0 rest 9 mest signifikant svar = 9C
Metoden er den samme som du brukte for å gjøre om fra binærtallsystemet til desimaltallsystemet bare at du nå må du finne verdiene til posisjonene i det heksadesimale tallsystemet.
Vi skal gjøre om tallet 02C4A3 til desimal. Vi lager en tabell for ordens skyld:
0 | 2 | C | 4 | A | 3 | |
165 = 1048576 |
164 = 65536 |
163 = 4096 |
162 = 256 |
161 = 16 |
160 = 1 |
|
0 | 2*65536 | +12*4096 | +4*256 | +10*16 | +3*1 | = 181411 |
Datamaskinen forstår ikke '-' tegn eller '+' tegn, og vi trenger en måte å skille negative fra positive tall. Vi kan gjøre det ved å legge til en ekstra bit på alle tall. Hvis denne biten er 0, så er tallet positivt, hvis biten er 1, så er tallet negativt. Hvis vi antar at vi har 5 biter til rådighet, så er:
5 = 00101 og -5 =10101
Men det finnes en smartere måte å representere negative tall. Metoden kalles toer-komplement og utgangspunktet er fortsatt at positive tall begynner med 0 og negative med 1. Med 5 biter kan vi representere 32 forskjellige verdier og med toer-komplement blir verdiene.
15 = 01111 14 = 01110 ... 4 = 00100 3 = 00011 2 = 00010 1 = 00001 0 = 00000 -1 = 11111 -2 = 11110 -3 = 11101 -4 = 11100 ... -15 = 10001 -16 = 10000
Det smarte med denne representasjonen av negative tall er at subtraksjon blir så enkelt å utføre "maskinelt". Den kan utføres som addisjon av de to tallene.
Eksempel
00010 (+2) 01111 (+15) 01110 (+14) + 11100 (-4) + 10000 (-16) + 11100 ( -4) = 11110 (-2) = 11111 ( -1) =(1)01010 (+10)
Dermed trenger datamaskinen bare kretser for addisjon og kretser som danner negative tall. Formelen for å skrive et tall på toer-koplement form er enkel:
-N = NI +1
Eller i naturlig språk. Skriv tallets absoluttverdi på binær form. Bytt om 1 med 0 og 0 med 1. Legg til 1 og du har tallet som toer-koplement
Overgang mellom desimalbrøk og binærbrøk er litt mer komplisert enn mellom desimale og binære heltall. Det du må huske på er at posisjonene til høyre for komma har en negativ eksponent.
0.35610 = 3*10-1 + 5*10-2 + 6*10-3
0,11011 = 1*2-1 + 1*2-2 + 0*2-3 + 1*2-4 + 1*2-5
Skriv den binære brøken som en sum av potenser og legg sammen potensene.
Eksempel:
0,1011 = 2-1 + 2-3 + 2-4 = 0,5 + 0,125 +0,0625 = 0,6875
Multipliser desimalbrøken med 2. Fjern sifferet til venstre for komma og ta vare på det. Gjenta operasjonen til det ikke er flere desimaler igjen (eller presisjonen er høy nok)
Eksempler:
0,375 0,375 * 2 = 0,750 0 mest signifikant 0,750 * 2 = 1,5 1 0,5 * 2 = 1,0 1 minst signifikant svar = 0,011
0,14 0,14 * 2 = 0,28 0 mest signifikant 0,28 * 2 = 0,56 0 0,56 * 2 = 1,12 1 0,12 * 2 = 0,24 0 0,24 * 2 = 0,48 0 0,48 * 2 = 0,96 0 0,96 * 2 = 1,92 1 0,92 * 2 = 1,84 1 0,84 * 2 = 1,68 1 minst signifikant svar = 0,001000111
De tallene vi har sett på til nå har vært heltall (uten desimaler), og de har vært begrenset i størrelse av antallet biter som det er plasstil i prosessorens registre (typisk 16, 32 og 64 biter).
Et heltall på 16 biter kan ha verdier fra 0 til 65535 eller fra -32768 til 32767 hvis det også skal omfatte negative tall. Med andre ord begrenset størrelse og ikke brøker.
Det er mulig å simulere større registre, men det er plasskrevende. Det vi trenger er en måte å representere store tall og desimalbrøker.
I datamaskinen gjøres dette med såkalte flyttall (floating point). Ideen er å skrive tallene på normalisert form også kalt vitenskapelig form (eng, scientific notation).
Eksempler fra det desimale tallsystemet:
10800102 => 1,0800102 * 107 0.00134 => 1,34 * 10-3
Eksempler fra det binære tallsystemet:
2,375 => 10,011 => 1,0011 E 1 384 => 110000000 => 1,1 E 1000 0,14 => 0,001000111101 => 1,000111101 E-11
Dette innebærer at en hver reell verdi kan representeres binært flytende av to binære tall:
Eks verdien til tallet X er:
X = A * 2R eller X = A E R
Antall biter i mantissen avgjør oppløsningen eller den relative nøyaktighet, og eksponenten gjør at verdien kan variere over mange størrelsesordener.
Formatet på flyttall kan variere noe fra maskin til maskin. Formatet på et 32-bits flyttall for en Intel prosessor er:
31 |
23 |
0 |
biased-eksponent |
mantisse |
||
mantisse-fortegn |
|
Intel benytter en biased (skjev) eksponent. Det betyr at eksponenten har fått et tillegg slik at den alltid er positiv. Tillegget er på 7F16 (12710 og 11111112).
Hvis eksemplene over skulle representeres som et Intel 32 biters flyttall ville vi få:
2,375 => 10,011 => 1,0011 E 1
Biased eksponent: 1 + 1111111 = 10000000
Mantisse: 0011
(obs! legg merke til at det er kun brøkdelen av mantissen
som blir lagret. )
Mantisse fortegn: 0 (positivt)
0 |
|
|
384 => 110000000 => 1,1 E 1000
Biased eksponent: 1000 + 1111111 = 10000111
Mantisse: 1
Mantisse fortegn: 0 (positivt)
0 |
|
|
0,14 => 0,001000111101 => 1,000111101
E-11
Biased eksponent: -11 + 1111111 = 01111100
Mantisse: 000111101
Mantisse fortegn: 0 (positivt)
0 |
|
|