Digitale maskiner og binære tall

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: 20. sept 2010

Digital?

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.

Analoge og digitale maskiner

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.

Tallsystemer

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.

Desimale tall

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

Binære tall

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.

Omregning fra binærtallsystemet til desimaltallsystemet

Hva er 101101012 i desimaltallsystemet? Vi setter opp en tabell:

1 0 1 1 0 1 0 1  
27 26 25 24 23 22 21 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.

Omregning fra desimaltallsystemet til binærtallsystemet

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 med binære tall

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

Heksadesimale tall

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.

Omregning fra binærtallsystemet til det heksadesimale tallsystemet

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

Omregning fra det heksadesimale tallsystemet til binærtallsystemet

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

Omregning fra desimaltallsystemet til det heksadesimale tallsystemet

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

 

Omregning fra det heksadesimale tallsystemet til desimaltallsystemet

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

 

Toer-komplement og negative tall

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 fra binærbrøk til desimalbrøk og omvendt

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

Fra binærbrøk til desimalbrøk

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
 	

Fra desimalbrøk til binærbrøk

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

Brøker og store tall

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

10000000

00110000000000000000000

384 => 110000000 => 1,1 E 1000
Biased eksponent: 1000 + 1111111 = 10000111
Mantisse: 1
Mantisse fortegn: 0 (positivt)

 0

10000111

10000000000000000000000

0,14 => 0,001000111101 => 1,000111101 E-11
Biased eksponent: -11 + 1111111 = 01111100
Mantisse: 000111101
Mantisse fortegn: 0 (positivt)

 0

01111100

00011110100000000000000