Wikibooks:Wachtruimte/Computerarchitectuur/Dataweergave: verschil tussen versies

Uit Wikibooks
Verwijderde inhoud Toegevoegde inhoud
Rutgeri (overleg | bijdragen)
Rutgeri (overleg | bijdragen)
Regel 72: Regel 72:


==Hexadecimaal stelsel==
==Hexadecimaal stelsel==
Het 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 nummers 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 als volgt.<br/>
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 alleen vermeld omdat geheugen adressen in de computer worden weergegeven in hexadecimale waarden.

De computer is echter alleen in staat om te werken met binaire waarden, nullen en eenen. De hexadecimale getallen moeten dus worden omgezet naar binaire getallen. Het eerste wat hierbij opvalt is dat de waarden die met een positie in een hexadecimaal getal kan worden weergegeven loopt van 0 tot 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 met 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 in hexadecimaal als in binair kan weergeven en de enige stap is het vervangen van iedere 0 tot f door vier bits.

Versie van 29 aug 2007 04:57

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.

Binair stelsel

Iedereen 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 uit vier bits. Een byte kan dus elke waarde van 0 (0000) tot 15 (1111) vertegenwoordigen. Een integer bestaat meestal uit 4 of 8 bytes. Als je weet hoeveel bits je tot je beschikking hebt, bijvoorbeeld 4 bytes * 4 bits geeft je 16 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 16 bits is dit dus 216 -1 = 65.535.

Negatieve waarden

Er 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 linkste 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

In de computer wordt voor het weergeven van negatieve waarden meestal gebruik gemaakt van een systeem genaamd two's complement. Dit veranderd 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 resulteerd 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

Optellen

Binair 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

Aftrekken 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

Voor 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

Het 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 nummers 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 als volgt.
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 alleen vermeld omdat geheugen adressen in de computer worden weergegeven in hexadecimale waarden.

De computer is echter alleen in staat om te werken met binaire waarden, nullen en eenen. De hexadecimale getallen moeten dus worden omgezet naar binaire getallen. Het eerste wat hierbij opvalt is dat de waarden die met een positie in een hexadecimaal getal kan worden weergegeven loopt van 0 tot 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 met 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 in hexadecimaal als in binair kan weergeven en de enige stap is het vervangen van iedere 0 tot f door vier bits.

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.