Wikibooks:Wachtruimte/Computerarchitectuur/Dataweergave
In het geheugen van van de computer worden alle gegevens opgeslagen in nullen en eenen, de zogenaamde bits. Een serie van bits kan een bepaalde waarde vertegenwoordigen, een binair getal. Dit binaire getal kan kan in verschillende contexten allerlei dingen weergeven, van een geheugenadres tot een letter in een tekst. Om de werking van de processor en het geheugen te begrijpen is allereerst een begrip van het binair stelsel nodig. Dit is slechts een korte introductie, later in het boek wanneer het wordt toegepast zullen we meer uitweiden.
Binair stelsel
bewerkenIedereen is gewend aan het decimaal of tientallig stelsel dat gebruik maakt van de nummers 0 tot en met 9. Het binair, of tweetallig stelsel, gebruikt enkel de 0 en de 1. Net als in het decimaal stelsel bepaalt de positie van het nummer de eigenlijke waarde: in het nummer 352 heeft de drie de waarde 300, de vijf de waarde 50 en de twee de waarde 2. Hoe bepalen we deze waarde nu eigenlijk?
We kunnen de posities nummeren van rechts naar links, beginnend met een 0. Eenheden hebben dus het nummer 0, tientallen het nummer 1, honderdtallen het nummer twee en zo verder. Om de waarde van een getal te bepalen nemen we de basis van het stelsel, in ons voorbeeld 10. We vermenigvuldigen het getal op een positie met 10 tot de macht van het nummer van de positie. De waarde van de nummers in 352 wordt dus als volgt bepaald:
- Positie 0 = 2 * 10 0 = 2
- Positie 1 = 5 * 10 1 = 50
- Positie 2 = 3 * 10 2 = 300
Bij elkaar geeft dit 352.
Het binair stelsel werkt exact hetzelfde, met als enige verschil het gebrek aan getallen, het zijn er maar twee. Dit betekent ook dat een positie niet als waarde een macht van 10 heeft maar een macht van 2. Zo is bijvoorbeeld de weergave van het getal 5 in binair 101. De waarde van deze binaire nummers wordt als volgt bepaald:
- Positie 0 = 1 * 2 0 = 1
- Positie 1 = 0 * 2 1 = 0
- Positie 2 = 1 * 2 2 = 4
Bij elkaar geeft dit 5.
Het grootste verschil tussen het binair en decimaal stelsel zit hem in het feit dat door het gebruik van alleen de nul en de een, iedere positie slecht 2 mogelijke waarden vertegenwoordigt, of nul, of 1 keer de waarde van de positie zoals hierboven beschreven.
Een standaardwaarde in een computer is een byte. Een byte bestaat, bij hedendaagse computers, uit acht bits. Een byte kan dus elke waarde van 0 (0000000) tot en met 255 (11111111) vertegenwoordigen. Een integer bestaat meestal uit 4 of 8 bytes. Als je weet hoeveel bits je tot je beschikking hebt, bijvoorbeeld 4 bytes * 8 bits geeft je 32 bits voor een integer, dan kan je de maximale waarde berekenen. Om deze waarde te vinden voer je de volgende berekening uit 2n -1 waarbij n het aantal bits is. Voor 32 bits is dit dus 232 -1 = 4.294.967.295.
Negatieve waarden
bewerkenEr worden twee manieren gebruikt om negatieve waarden weer te geven in computersystemen. De belangrijkste en eenvoudigste is door middel van een signbit (teken). Dit betekent dat het meest linkse bit in een getal wordt gebruikt om aan te geven of een getal positief of negatief is. In veel programmeertalen kom je dan zowel signed als unsigned variabelen tegen.
Een belangrijk aspect van signed variabelen is dat ze een lager maximumwaarde hebben dan hun unsigned variant. We nemen als voorbeeld weer even een 16-bit integer. Als deze unsigned is dan liggen alle waarden tussen de 0 en de 65.535. Als deze echter signed is dan worden alle mogelijke waarden verdeeld over positieve en negatieve getallen, waarbij de nul als positief wordt gezien. Doordat het laatste bit wordt gebruikt als signbit wordt het bereik van de integer nu - 215 tot 215 -1, oftewel -32.786 to 32.785.
Two's Complement
bewerkenIn de computer wordt voor het weergeven van negatieve waarden meestal gebruik gemaakt van een systeem genaamd two's complement. Dit verandert niks aan de maximale en minimale waarden van bijvoorbeeld een integer, alleen aan de weergave hiervan.
Bij two's complement geeft het meest linker bit nog steeds aan of een waarde negatief of positief is. Om het rekenen voor de computer echter makkelijker te maken worden er twee verandering doorgevoerd in de weergave. Om bijvoorbeeld -55 weer te geven beginnen we met 55, we gebruiken weer een 8 bits kleine integer.
0011 0111 = 55 Om dit getal negatief te maken volgens de two's complement methode vervangen we alle nullen door enen en vice versa. En tellen hier daarna 1 bij op wat resulteert in het volgende: 1100 1001 = -55
Voor deze methode is gekozen omdat dit het optellen en aftrekken met negatieve waarden gemakkelijker maakt (vooral voor de computer). Hierover meer in de paragraaf over binair rekenen.
Binair rekenen
bewerkenOptellen
bewerkenBinair rekenen is in principe niet veel anders van het optellen en aftrekken dat je gewend bent met normale (decimale) getallen. Om het makkelijk te maken zetten we bij de uitwerkingen de binaire getallen onder elkaar. Neem bijvoorbeeld 5 + 8
101
1000 +
1101 => 13
Mocht je nu een 1 bij een 1 op moeten tellen dan werkt dat hetzelfde als wanneer jij bij decimaal optellen meer als 9 (de maximale waarde, net als de 1 bij binair) krijgt. Je vult een 1 in op de volgende (linker) positie en de restwaarde op de huidige positie.
1011
0101 +
10000 => 16
Aftrekken
bewerkenAftrekken werkt net als optellen, hetzelfde als bij het decimale stelsel. Hier volgt een simpel voorbeeld 6 - 1:
110
1 -
101 => 5
Zoals je ziet wordt ook hier gewoon geleend van de grotere waarde (links) als de waarde op de huidige positie kleiner is dan de waarde waarmee verminderd moet worden.
Rekenen met negatieve waarden
bewerkenVoor getallen met een negatieve waarde werkt dit niet anders. Het belangrijkste wat je bij deze getallen moet onthouden is dat ze een vast aantal bits of nummers hebben. Bij eerdere opgaven voegden we een getal aan de linker kant toe. Als je maar beperkte ruimte hebt zoals op de computer dan kan dit niet. Laten we voor dit voorbeeld een kleine integer nemen van 8 bits. De som -5 + 8
1111 1011 => -5 in two's complement 0000 1000 + => 8 0000 0011 => 3
Deze uitwerking verdient enige uitleg. Laten we beginnen met de waarde -5. Om deze waarde weer te geven volgens de two's complement methode nemen we als uitgangspunt het getal vijf, binair geschreven 0000 0101. De eerste stap is het veranderen van alle nullen in eenen en eenen in nullen, 1111 1010. Hierna voegen we 1 to aan dit getal, 1111 1011. Als we hier nu 8 (0000 1000) aan toevoegen kunnen we gewoon optellen volgens de eerder besproken regels, de uitkomst zou dan zijn : 1 0000 0011. Omdat we echter te maken hebben met een 8 bits integer kunnen we maar 8 posities gebruiken, alles wat hier buiten valt, ookwel de overflow genoemd valt weg, in ons geval is dat de meest linker 1.
Een tweede bijwerking van de overflow is dat de waarden van een getal in je programma code zich gedragen als een cirkel. Je kan blijven optellen of aftekken en je zal altijd een getal krijgen dat met het toegelaten aantal bits is weer tegeven. Het getal zal in de meeste gevallen een onzinnige waarde hebben. Om dit aan te tonen beginnen we met de laagste negatieve waarde en trekken daar een willekeurig getal vanaf.
1000 0000 => Het laagste negatieve getal met een waarde -128 0000 0101 - => 5 er van aftrekken 0111 1011 => 123
<Illustratie van de cirkel volgt>
Hexadecimaal stelsel
bewerkenHet hexadecimaal stelsel wordt ook wel het zestientallig stelsel genoemd. Dit omdat de basis uit zestien in plaats van tien tekens bestaat. Welk zes zijn er dan aan 0 tot en met 9 toegevoegd vraag je je af. Omdat er geen andere cijfers zijn die voor deze weergave te gebruiken zijn, gebruikt men de letters A tot en met F. De tekens van het hexadecimale stelsel zijn dus:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Hierbij vertegenwoordigen A - F de waarden 10 - 15. We zullen weinig stil staan bij het rekenen met deze getallen. Ze worden voornamelijk vermeld omdat hexadecimale getallen voor een mens overzichtelijker zijn dan al die nullen en enen van het binaire stelsel, en er een eenvoudige relatie is tussen hexadecimale getallen en binaire.
Hexadecimale getallen kunnen gemakkelijk worden omgezet naar binaire getallen en omgekeerd. Het eerste wat hierbij opvalt, is dat de waarden die met een positie in een hexadecimaal getal kunnen worden weergegeven, lopen van 0 tot en met 15. Dit komt overeen met de minimale en maximale waarde van een getal van vier posities in het binaire stelsel, te weten 0000 (0) tot 1111 (15). Met andere woorden, iedere positie in een hexadecimaal getal is te vervangen door vier posities in een binair getal, of vier bits.
Om nog iets meer nadruk te leggen op deze relatie die vooral bij een computer van belang is. Een byte is 8 bits, of twee hexadecimale getallen. Voor alle vormen van opslag op de computer is de byte de kleinste eenheid. Dit betekent dat je alle waarden op je computer zowel hexadecimaal als binair kan weergeven en de enige stap het vervangen van iedere 0 tot F door vier bits is.
Dit is allemaal wat beknopt maar we komen hier later nog uitgebreid op terug bij de behandeling van cache en (virtueel) geheugen.