Talsystemer | |
|
1. Talsystemer | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Når man skal studere et abstrakt begreb, som talsystemer, er det en god idé at starte med, hvad man kender til emnet fra det praktiske liv. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Romertal |
Igennem tiderne har man brugt forskellige talsystemer. Det mest kendt af de forgangne er nok romertallene. Romertallene er opbygget på en speciel måde. I romertal bruges symboler som: I, V, X, C, M osv. F.eks. er IV et romertal. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Når man skal fortolke værdien af et romertal, sker dette ved udregning. De enkelte symboler har forskellige værdier: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
I = 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Man skal følge nogle specielle regneregler: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dernæst anvender man nogle regler; hvor man ser parvis på symboler der står ved siden af hinanden. Lad os kalde disse A og B; hvor A står umiddelbart til venstre for B - altså AB: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
En række begreber er blevet introduceret ved vores behandling af romertallene. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ti fingre |
Vi bruger normalt 10-talssystemet, også kaldet det decimale system. 10-talssystemet kalder også araber-tal, da de stammer fra de arabiske matematikere. Tallet 10 er grundtallet i vores talsystem; hvilket med al overvejende sandsynlighed kommer af, at vi har ti fingre. Men hvad betyder det, at grundtallet er 10? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hvis man ser nærmere på et vilkårligt tal, f.eks. 4175, kan det udtrykkes som 4 tusinder, 1 hundrede, 7 tiere og 5 enere. At dette er et tal i 10-talssystemet ses af, at det der tælles: tusinder, hundrede, tiere og enere kan skrives som potenser af 10. Lad os se det skematisk: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 1: Decimalt eksempel |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tallet 10 kaldes grundtallet, og er afgørende for, hvordan en række cifre skal fortolkes som værdi. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bit |
I en computer arbejder vi med symboler bestående af kombinationer af strøm og mangel på strøm. Vi plejer at notere disse kombinationer som et-taller (strøm) og nuller (ingen strøm), og vi kalder hver af disse for en bit. Hvordan skal man så repræsentere tal med disse kombinationsmuligheder? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2bits kombinationer |
Hvis vi i første omgang skal prøve at holde os til 10-talssystemet er spørgsmålet, hvor mange bit, der skal til for at lave ti forskellige kombinationer. Med en bit kan vi lave 2 kombinationer: 0 og 1. Med to bit kan vi lave 4 kombinationer: 00, 01, 10 og 11. Hver gang vi føjer en bit mere til kan vi lave dobbelt så mange kombinationer. Det er fordi vi med den næste bit kan lave to, og for hver af dem de samme som før vi føjede den til. Man kan derfor beregne antallet af kombinationsmuligheder som 2 opløftet til antallet af bit. Med 3 bit, 23 = 8 kombinationer. Endnu ikke nok til at repræsentere et ciffer i titalssystemet, men med 4 bit, 24 = 16 kombinationer får vi nok og lidt ekstra. Vi kan derfor bruge 4 bit til at repræsentere ét ciffer i 10-talssystemet. Hvis vi skal repræsentere et to-cifret tal skal vi bruge 8 bit osv. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Stort spild ved BCD |
At repræsentere decimale tal på denne måde, med 4 bit, er umiddelbart i orden, men der går 6 kombinationer til spilde. Med ét ciffer giver det et spild på 6/16 = 37,5%, med to cifre (256-100)/256 = 60,9%, med tre cifre (4096-1000)/4096 = 75,6%, osv. Vi kan konstatere, at store tal repræsenteret på denne måde giver et enormt spild af kombinationer. Denne repræsentationsform kaldes binary coded decimal (BCD) og bliver anvendt, men kun i meget begrænset udstrækning. Hvad kan man ellers gøre? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hvis man skriver en kombination af f.eks. 4 bit, det kunne være 0101, ser man, at der er fire pladser, hvor der kan stå enten 0 eller 1. Et decimalt tal er bygget op på samme måde, men her kan der på hver plads stå et af ti forskellige tegn. Vi valgte at fortolke 4175 som et decimalt tal, men vi kan også vælge at fortolke 0101 som et decimalt tal, nemlig 101. Da det kan være lidt vanskeligt at se om vi mener en kombination af 3 bit eller tallet 101, vil vi fremover skrive decimale tal som 101D, hvor det lille D står for Decimalt. Vi kunne også vælge at fortolke 0101 anderledes! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
I 10-talsystemet findes der 10 mulige cifre/tegn. En bit kan være enten 0 eller 1, altså to mulige tegn, som vi kan fortolke som cifre. Med 2 mulige cifre vil det være naturligt at fortolke det som et tal i 2-talsystemet! 2-talsystemet kaldes også det binære talsystem. Lad os se det samme skema for 2-talsystemet, som vi lavede for 10-talsystemet. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 2: Binært eksempel |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Man kan derfor beregne 0101's decimale værdi som: 0*8+1*4+0*2+1*1 = 5D . | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Binary digit |
Det binære talsystem er det, der er det mest naturlige for computere som vi kender dem i dag. Ordet "bit" betyder BInary digiT, binært ciffer. Vi vil i det følgende, analogt til decimal tal, skrive binære tal som, f.eks. 0101B for at kende dem fra de decimale. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.1 Omskrivning til octalt/hexadecimalt | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Der er dog et mindre problem med de binære tal: De fylder! f.eks. er 4175D binært 1.0000.0100.1111B, hvilket er upraktisk langt. F.eks. er det ikke egnet til at blive udtalt! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Man kunne omregne det til det decimale tal 4175D og bruge det, og så lave omregningen frem og tilbage efter behov. Det viser sig dog at være en meget dårlig idé. Det skyldes at 2-talssystemet og 10-talsystemet er meget skæve i forhold til hinanden. Det er simpelthen besværligt! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Let at omregne |
Der er ikke noget lettere for mennesker at forstå end decimal-tal. Når vi i stedet vælger en anden repræsentation, end den decimale, til at håndtere binære tal må vi derfor ikke forvente, at den bliver lige så let at forstå. Vi forlanger kun, at det er let at omregne mellem binært og denne repræsentation, samt at den er nemmere at håndtere end de lange bit-strenge. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tæt på ti er mere læsbart |
Vi vælger derfor et nyt talsystem, med et andet grundtal end 10, til at løse denne opgave for os, men hvilket? For at give os så meget som muligt en fornemmelse af, hvad tallet er decimalt og specielt, at vi kan bruge de kendte cifre 0, ... , 9 må vi vælge et grundtal på ca. 10. Vi så tidligere, at et decimalt ciffer passede dårligt med det antal bits (vi fik, at vi skulle bruge 4 bit = 16 kombinationer, altså et dårligt match!), der skulle til for at repræsentere det. Vi vil derfor vælge et talsystem der passer præcist med antallet af kombinationer for et vist antal bits. 4 bit gav 16 kombinationer, så 16-talsystemet er en mulighed. 3 bit giver 8 kombinationer, så 8-talsystemet er også en mulighed. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16-talsystemet kaldes det hexadecimale talsystem, eller blot hex! Det har den ulempe, at man i modsætning til 8-talsystemet, ikke kan nøjes med cifrene 0, ..., 9. Man vælger at bruge bogstaverne A, ..., F for cifrene 10D, ..., 15D . | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vi kan nu lave en samlet opstilling med alle cifrene for vores fire talsystemer: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 3: Cifre i talsystemerne |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Som det ses kaldes 8-talssystemet også for det octale talsystem. Man kan ligeledes lave tabeller som vi gjorde for det decimale og det binære talsystem . | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
I det octale talsystem bliver vores eksempel 4175O. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 4: Octalt eksempel |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vi kan her beregne, at 4175O = 4*512+1*64+7*8+5*1 = 2173D . Ved umiddelbart at sammenligne de to tal ses, at det octale er "større" end det decimale. Det vil altid være således, da vi har færre mulige cifre i det octale, og derfor må bruge flere cifre for at få det samme antal kombinationer! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
I det hexadecimale talsystem bliver vores eksempel 4175H. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 5: Hexadecimalt eksempel |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vi kan her beregne, at 4175H = 4*4096+1*256+7*16+5*1 = 16.757D . Her får vi i modsætning til det octale talsystem, at hex er kortere end decimalt. Det skyldes at hex har seks mulige cifre mere end det decimale, og vi derfor kan skrive flere kombinationer med det samme antal cifre. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Den observerede sammenhæng mellem antal cifre og mulige cifre, kan man også se når man studerer "den lille tabel": | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 6: "Den lille tabel" |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Det er en god idé at studere denne tabel grundigt. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Arver dårligt decimalt forhold |
Det første man observerer er, hvor dårligt det decimale passer sammen med de andre. Det skyldes netop, at vi har valgt det octale og det hexadecimale for, at det skulle passe med det binære, hvorved de "arver" det dårlige forhold mellem det binær og det decimale talsystem. Det er f.eks. tydeligt i den nederste linie, hvor de tre andre er pæne tal: 10000B , 20O og 10H , og det decimale er 16D! | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Enkelt at omskrive |
Nu var argumentet for at indføre det octale og det hexadecimale talsystem at det var nemt at omregne til og fra det binære. Det er utrolig enkelt! Hvis man vil omregne fra binært til octalt, skriver man det binære tal op, og sætter en prik mellem hver tredie, startende fra højre. F.eks.: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
For hver gruppe af 3 bit skriver man det tilsvarende octale ciffer fra "den lille tabel": | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Altså er 1000001001111B = 10117O . Man kommer den anden vej fuldstændig analogt. For omregning med det hexadecimale talsystem deler man blot i blokke af fire; hvilket med det samme binære tal giver: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Og dermed, at 1000001001111B = 104FH . | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Byten |
Det octale talsystem er det mindst brugte af de fire. Man skulle umiddelbart tro, at det hexadecimale var det mindst brugte pga. af ulempen med de ekstra mulige cifre. Sådan var det også i begyndelsen men én bestemt ting gjorde, at hex for tiden er det mest udbredte: Byten! I de fleste computere er data opdelt i bytes (8 bit) eller multiplum af otte, f.eks. 16 og 32. Da det octale talsystem samler 3 bits af gangen og hex 4 bit, er det afgørende, at 4 går op i 8, mens 3 ikke gør! Et eksempel på, at det octale kan være praktisk er fileadgangsbeskyttelsen i UNIX med de tre "cifre" r, w og x. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vi har nu set hvorledes man let kan omskrive mellem binært« octalt og binært« hex. Vi har dermed fået en mere praktisk måde at notere binære tal på, men vi har stadig problemet med at omregne mellem det binære og det decimale! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.2 Omregning til/fra decimalt | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.2.1 Den positionelle metode | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vi har allerede anvendt en teknik for octal og hex (for at studere dem) som også kan bruges på omregning fra binær til decimal. Metoden er den positionelle metode. Hver position i tallet har en bestemt positionsværdi, som ganges med det ciffer der står på positionen og man summerer det hele. Lad os se en række af de binære positionsværdier: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 7: Binære positions-værdier |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tilnærmede metode |
Hvis vi f.eks. ville omregne 1.0000.0100.1111B til decimalt kunne det gøres ved at summere alle positionsværdierne for 1'erne i det binære tal, altså: 4096+64+8+4+2+1 = 4175D . Man kan ikke bruge den positionelle metode den anden vej, for hvad er den binære positionsværdi for 7 i 4175? Man kan i stedet bruge den tilnærmede positionelle metode. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Den tilnærmede positionelle metode forløber som følger: Hvilken positonsværdi kommer tættest på 4175D uden at overstige den? Det gør 4096, der svarer til position 12. Vi sætter et 1-tal på position 12, trække 4096 fra 4175 og arbejde videre med resultatet. Den samlede udregning ser ud som følger: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ovenfor er i parentes angivet på hvilket positioner der skal sættes en bit. Når vi f.eks. trækker 64 fra 79 skal vi derfor sætte en bit på position 6 da 64 = 26. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.2.2 Forskydningsmetoden | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bedst til programmer |
I stedet for de positionelle metoder kan man også bruge forskydningsmetoden. Forskydningsmetoden egner sig bedst til programmer. Det skyldes at den er meget enkel at udføre i sine skridt, men der er til gengæld mange af dem. Den kan dog også (med påpasselighed og hovedet under armen) bruges manuelt. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
På grund af metodens mange skridt vil vi indskrænke os til at omforme det binære tal 1101B . | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Lad os igen starte med at omregne fra binært til decimalt, og lad os først se hele processen: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Skubber" ind i andet talsystem |
Man kunne også skrive denne udregning som: (((((1)*2)+1)*2)+0)*2)+1 = 13. Idéen er, at man "skubber" det binære tals cifre ind i det decimale med "hastigheden" 2. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Skal man den anden vej: fra decimal til binær skubber man den anden vej, dvs. man dividerer med 2: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Man læser nu resterne, nede fra og op og resultatet er 1101B . | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hvilket talsystem skal man så bruge: binært, octalt eller hex? Det kommer helt an på situationen. Man skal ikke føle sig bundet til en bestemt. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mht. omregningsmetoder skal man også vælge den der forekommer mest praktisk i den pågældende situation. Hvis man laver et program til omregning, vil man dog finde at forskydningsmetoden er den mest enkle. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2. Negative tal | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vi er nu i stand til at repræsentere tallene fra 0 op til hvad som helst, bare vi bruger bits nok. Men hvad med negative tal? Vi skal se på flere forskellige metoder, ikke alle lige hensigtsmæssige! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Den første idé man kunne få, ville være at bruge en bit til at angive om tallet skulle regnes for negativt eller positivt. Det ville altså kræve en ekstra bit ud over dem der angiver "tallet". Da et fortegn altid står forrest, ville det være naturligt at sætte denne bit foran "tallet". Lad os indskrænke os til at arbejde med 3 bit, hvoraf den ene er fortegnsangivelsen. Med denne konstruktion ville vi kunne repræsentere flg. værdier: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 8: Fortegns-bit |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
To nuller |
Ovenfor er tallene opstillet i rækkefølge efter de 3 bits fortolket som et positivt tal. Det viser os nemlig en række fænomener der kan give grund til bekymring: Der er to nuller! Både et plus nul og et minus nul. Men det værste: Efter -0 kommer -1 og ikke 1! Det synes måske umiddelbart at være ugennemskueligt, hvorfor det skulle været et problem, men man skal tænke på hvor anvendelig repræsentationen er. Da det er tal vi arbejder med at repræsentere, skal vi på et tidspunkt kunne regne med dem. Lad os se hvordan man adderer, f.eks. 01100111B med 00111001B: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Skal kunne regne normalt |
Eksemplet er med vilje valgt så der kommer mange menter for at understrege, at der regnes fuldstændig normalt med binære tal som med alle andre tal. Når vi vil lave en repræsentation af negative tal vil det være hensigtsmæssigt hvis et meget positivt tal f.eks. 35 og et ikke så negativt tal, f.eks. -4, lagt sammen gav en bit-repræsentation, der svarede til 31. Lad os se et regne-eksempel taget fra vores 3 bit repræsentation. Vi vil lægge 2 og -1 sammen: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Også regne med fortegns-bit |
Her blev der ingen menter, men bemærk, hvad 111 er i vores 3 bit repræsentation: -3! Det dur ikke, vi kan ikke blot regne med repræsentationen som om den forreste bit var et almindeligt binært ciffer. Nu er den forreste bit ikke et binært ciffer, så det synes måske ikke så skuffende: "Hvorfor skulle vi kunne gøre det, når det netop ikke er et binært ciffer?". Svaret er, at det ville være praktisk ikke at skulle behandle de negative tal specielt ved regning. Men er det muligt? Under alle omstændigheder må vi så kassere denne fortegns-bit repræsentation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
For at få en idé om hvad der grundlæggende er galt med vores repræsentation vil vi kort se på temperaturskalaer. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Celsius og Kelvin |
De fleste er nok bekendt med Celsius-skalaen med 0°C for vands frysepunkt og 100°C for vands kogepunkt. Ligeledes har de fleste nok hørt om Farenheit-skalaen, men de færreste kan regne med den. Det er også ligegyldigt i denne sammenhæng for den skala vi vil stille op over for Celsius-skalaen er ikke Farenheit men Kelvin1. Kelvin-skalen har nemlig den fordel, at den har samme ækvidistance som Celsius-skalen. Dvs. at stiger temperaturen en grad Celsius, stiger den også en grad Kelvin. Forskellen er, at Kelvin-skalaen starter ved det absolutte nulpunkt -273°C. Da der ikke findes temperaturer under det absolutte nulpunkt betyder det at Kelvin-skalaen kun har positive værdier. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Situationen er lidt den sammen som med vores binære tal. Vi har vores "Kelvin-skala": vores positive tal. Men vil nu have en "Celsius-skala", med både positive og negative tal. Lad os stille Celsius-skalaen op over for Kelvin-skalen så vi bedre kan gennemskue problemstillingen: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Figur 1: Kelvin og Celcius temperaturer |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Skalaerne er lidt fortegnede for at kunne se nogle interessante temperaturer omkring Celsius' nulpunktet. Først ser man, at der kun er ét nul på Celsius-skalaen, og man ser, at regnet på Kelvin skalen kommer -1°C, 0°C og +1°C efter hinanden. Det gjorde de ikke i vores repræsentation med fortegns-bit! Når man lægger tal sammen er dette afgørende, hvis man skal får det rigtige resultatet i repræsentationen. Vi skal derfor ændre vores repræsentation så dette kommer til at passe. Hvis vi ser på vores skema fra før, skal bit-kombinationerne komme i samme rækkefølge, men vi skal ændre vores fortolkning af dem: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 9: Excess |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ligesom Celsius-skalaen kan forskydes i forhold til Kelvin-skalaen og stadig indeholde både positive og negative tal, således kan vi også vælge at forskyde vores fortolkning af repræsentationen. Ovenstående fortolkning kaldes excess. Lad os undersøge repræsentationen. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
For det første er der kun et nul! Men kan man regne med det. Lad os f.eks. prøve (0 + -1) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hvilket er +3. Det dur stadig ikke! Problemet er at de negative tal bringer os frem, og ikke tilbage på skalaen. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Det er ikke overraskende da 0°C plus -1°C på Kelvin skalen giver 545! For at komme videre må vi gå en anden vej. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hvad sker der hvis man lægger 1 til den største værdi vi kan have med 3 bit som binære cifre? | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vi får en værdi der falder uden for vores repræsentation. Hvis vi blot smider den ekstra foreste bit væk står der 000, altså er vi kommet tilbage til starten igen! Hvis man regner på denne måde kommer vores repræsentation til at virke som en tallinie der er bøjet rundt i en cirkel: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Figur 2: |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Men hvordan skal vi udnytte dette? Man bemærker at 111B+001B = 000B . Altså har 111B den samme virkning som vi ønsker -1 skal have. Hvad skal så være -2? Man skal løse den binære ligning X+010B = 000B . Den har løsningen 110B . Dette ses ved at løse ligningen en bit af gangen fra højre mod venstre! 110B er én mindre end 111B , Hvorfor -3 analogt er 101B osv. Det giver følgende repræsentation: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 10: 2. komplement |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2. komplement omregning |
I forhold til vores første forsøg med fortegns-bit er de negative tals rækkefølge vendt, og -0 er nu udnyttet til et ekstra negativt tal. Man bemærker også, at man ud fra den binære repræsentation stadig kan se om tallet er positivt eller negativt ved, at se på den forreste bit. Ovenstående repræsentation virker, men hvordan kommer man fra den ene til den anden? Det gøres ved at negere tallet og lægge én til. Se f.eks. i tabellen mht. +2 og -2: 010B negeret er 101B og med én lagt til bliver det 110B; hvilket er -2 i tabellen. Når man vil den anden vej gøres nøjagtig det samme. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Repræsentationen kaldes 2. komplement. Der findes også en form der hedder 1. komplement, den ser ud som: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tabel 11: 1. komplement |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Man bemærker at der her er to nuller. Til gengæld er værdimængden symetrisk omkring nul; hvilket den ikke er for 2. komplement, hvor der er et negativt tal mere end der er positive. 1. komplement fås ved blot at negere. Når man beregner 2. komplement laver man derfor først 1. komplement og lægger derefter én til! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Kan regne i 1. komplement |
Hvor utroligt det end lyder kan man regne næsten almindeligt med 1. komplement tal. I modsætning til 2. komplement, hvor man smider en overskudende mente væk, lægger man den i 1. komplement til resultatet! Lad os se et eksempel: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hvor -1+2 = +1. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vi har nu set fire muligheder for at repræsentere negative tal: Fortegns-bit, excess, 1. og 2. komplement. Den der bruges er 2. komplement, da den kun har ét nul og man kan regne "normalt" med den! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3. Radix specifikation | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Når man angiver tal i assembler har man behov for entydigt at specificere, hvilket talsystem angivelsen skal fortolkes i. Det gøres ved at sætte et bogstav efter tallet. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Decimal-tal er default, men man kan alligevel vælge at sætte et 'D' efter for at tydeliggøre for læseren af programmet, at der er tale om et decimal-tal, f.eks.: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Binært angives med bogstavet 'B' og hex med 'H'. I forbindelse med hex skal man være opmærksom på et entydighedsproblem. F.eks.: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Kollision med register-navne |
Registrene AH, BH, CH og DH kan også fortolkes som AH, BH, CH og DH. Assembleren vil vælge at fortolke dem som registre. Man løser problemet ved at foranstille et 0; hvorved hex-værdien er den samme, men det ikke længere kan forveksles med et register. Man bør derfor gøre det til en god vane altid at sætte et 0 foran alle hex-værdier, da det kan være en vanskelig fejl at finde. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Octalt ikke muligt |
Det er ikke muligt at angive octale tal i Intel-assembler. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ikke case-sensitive |
Det er uden betydning om bogstaverne er store eller små. F.eks. kan man bruge flg.: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4. Binary coded decimal | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[Mangler] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Fodnoter | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | Kelvin skalaen strækker sig præcist fra -273,15°C. Da 273.16 K i virkeligheden er defineret som vands tripelpunkt 0,01°C (den temperatur hvor vand, is og vanddamp kan optræde stabilt samtidig) er der en unøjagtighed mht. det, der står i teksten ovenfor. Denne oprindelige unøjagtighed ved definitionens tilblivelse gør, at Kelvin skalaen i virkeligheden har en negativ del ned til -0,01 K. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Repetitionsspørgsmål | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | Hvad er et grundtal? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | Hvorfor bruger vi binære tal i en computer? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | Nævn en ulempe ved binary coded decimal? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | Hvorfor foretager vi omskrivninger fra det binære talsystem? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | Hvorfor vælger vi det octale og hexadecimale talsystem når vi omskriver fra binært? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | Hvad er værdien af symbolerne D og E i det hexadecimale tal-system? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | Hvorfor er der et dårligt omregningsforhold mellem octalt/hexadecimalt og decimalt? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | Hvorfor er hexadecimalt mere udbredt end octalt? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 | Hvad går den positionelle metode ud på? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | Hvad er den tilnærmede positionelle metode? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 | Hvorfor er forskydningsmetoden bedst til programmer? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12 | Hvordan kan man altid se fortegnet for negative binære tal? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13 | Hvilke ønsker har vi til repræsentationen af negative binære tal? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 | Hvilken repræsentationer af negative tal har to nuller? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
15 | Hvad er idéen i excess? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16 | Hvad er 1. komplement? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
17 | Hvad er 2. komplement? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18 | Hvordan regner man med 1. komplement? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
19 | Hvilket problem er der mht. at angive hex i assembler? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Opgaver | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 |
Skriv følgende binære tal på henholdsvis octal og hexadecimal form.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 |
Omregn de binære tal, fra opgave 1, til decimalt med:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 |
Beregn den binære repræsentation af flg. tal ved 2. komplement (med 8 bit).
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 |
Beregn den decimale repræsentation af flg. binære tal, der er angivet i 2. komplement:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 |
Udregn følgende regnestykker i de talsystemer de er angivet i. Dvs. uden at gå over i andre talsystemer som mellemregning.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Svar på repetitionsspørgsmål | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | Grundtallet for et talsystem er det tal der opløftet til positionernes numre give de positionelle værdier. Grundtallet er samtidig antallet af symboler i talsystemet. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | Vi bruger binære tal, fordi en computer opbevarer informationer i form af strøm eller manglende strøm. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | Der er et stort pladsspild ved BCD, i forhold til almindelig binær repræsentation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | Fordi binære tal rent notationsmæssigt er uhåndterlig lange. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | Fordi de er lette at omskrive til/fra binært. At 8 og 16 ligger tættest omkring 10 gør samtidig, at man lettere får en fornemmelse af den decimale størrelse. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | D=13 og E=14. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | Det dårlige omregningsforhold stammer fra det tilsvarende dårlige omregningsforhold mellem binært og decimalt. Dette skyldes at 10 ikke kan skrives som en 2-potens. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | Pga. byten, der med 8 bits passer til hexadecimalt, men ikke til octalt. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 | At man sammentæller de positionelle værdier for hvert ciffer i tallet. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | Man trækker hele tiden den størst mulige positionelle værdi fra og noterer sig hvilke positioner de tilhører. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 | Fordi hvert skridt i forskydningsmetoden er meget enkelt. Da der er mange af dem egner de sig ikke til manuel udregning. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12 | Når man også arbejder med negative binære tal angiver man fortegnet som den foreste bit. 0=positiv, 1=negativ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13 | Fortegnet skal kunne ses af den første bit, kun ét nul og man skal kunne regne normalt. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 | Almindelig fortegns-bit og 1. komplement. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
15 | Idéen er lave bevare rækkefølgen af de almindelige binære tal, i forhold til de tal de repræsenterer. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16 | En negering af alle bits. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
17 | 1. komplement efterfulgt af en addition med én. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18 | Man regner ganske normalt, men en evt. mente skal lægges til resultatet. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
19 | Der er navne-kollision med registrene. Man bør derfor altid bruge et foranstillet 0 i forbindelse med hex. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vejledende løsninger til opgaverne | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 |
I det følgende, er det andet foranstillede 0 i opgave d bevaret, for at fremhæve ensartetheden i forløbet.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 |
Opgave a-d er simple at omregne til binært, da 1, 128, 4 og 64 er 2-potenser. Opgave e er en almindelig omregning, med den tilnærmede positionelle metode.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 |
|