2. Beginnen met PHP

2.3 - Data types

Niet alle soorten gegevens zijn hetzelfde. Een letter is iets anders dan een getal, en ook tussen getallen maken wij als programmeurs onderscheid. We gaan deze verschillen uitgebreid behandelen, zodat je een stevige theoretische basis hebt en begrijpt wat er onder de motorkap van PHP allemaal moet gebeuren om jouw code te laten werken.

2.3.1 - Binair

Het meest voor de hand liggende datatype is binair. Binair wil in feite zeggen dat er maar twee mogelijke waarden zijn: waar of onwaar. Wat daarbij wél opmerkelijk is, is dat we verschillende manieren hebben om deze te noteren. En in PHP is het hele concept waar of onwaar ook nog eens iets minder helder dan in de meeste andere programmeertalen, althans in het gebruik. Maar daar komen we later nog eens op terug.

In principe bestaat "waar" uit twee verschillende notaties:

1, true

En daarnaast bestaat "onwaar" ook uit twee verschillende notaties:

0, false

Dit zou genoeg moeten zijn, maar het concept waar of onwaar valt niet samen te vatten in deze simpele notaties. Waar of onwaar kan ook zoveel betekenen als: "Bestaat de variabele?" of "Heeft de variabele een inhoud?" In de praktijk zul je deze bijzondere situaties nogal eens tegenkomen, dus daar komen we in het hoofdstuk Control Statements nog uitgebreid op terug.

Een binaire variabele kunnen we classificeren als een boolean, of kortweg bool. Dit is een belangrijke term die je zeker moet onthouden.

2.3.2 - Integer

Een integer is (in principe) een geheel getal. Dat wil zeggen: 4 of 5037 of 3947202. Het belangrijkste verschil tussen een integer en ? (het wiskundige symbool voor alle gehele getallen), is dat de range van een integer eindig is. Dit klinkt wellicht vaag, dus gaan we er nog iets dieper op in.

Bits
Computers hebben altijd een "aantal bits". Vroeger was een 16-bit computer (of zelfs minder) heel normaal, tot de 32-bit computer uitkwam. Tegenwoordig zijn de meeste computers 64-bit. We zijn in dit hoofdstuk begonnen met het binaire datatype, omdat dit de basis vormt voor alle andere datatypes. Onderaan de streep, is alles namelijk een reeks enen en nullen. Als voorbeeld gebruiken we een 4-bit integer. (Let op: programmeurs beginnen met tellen bij 0 in plaats van 1.)

8 - bit3 4 - bit2 2- bit1 1 - bit0 Waarde
0 0 0 1 1
0 0 1 0 2
0 1 0 0 4
1 0 0 0 8
0 0 1 1 3
1 1 1 1 15


Als we deze tabel goed bekijken, zien we dat we van rechts naar links werken. De binaire code 1001 staat bijvoorbeeld voor 9. Met een 4-bit integer kun je dus een maximale waarde hanteren van 15 (1111). Toch is ook dit niet helemaal waar. Dit geldt namelijk alleen voor de zogenaamde "unsigned" integer.

Signed en unsigned
Een signed integer en een unsigned integer hebben een verschillend bereik. Dat heeft te maken met de hoeveelheid bits die beschikbaar zijn. Denk bij "signed" dan ook aan "teken", een minteken (-) welgezegd. Om dat minteken "kwijt" te kunnen, gaat er een bit verloren. Om te vergelijken:

Unsigned:

bits    waarde
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000    8
1001    9
1010   10
1011   11
1100   12
1101   13
1110   14
1111   15

Signed:

bits    waarde
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000   -8
1001   -7
1010   -6
1011   -5
1100   -4
1101   -3
1110   -2
1111   -1

Inmiddels valt het je misschien op dat bij een signed integer de laatste bit wordt gebruikt om aan te geven of het getal positief of negatief is en bij een unsigned integer niet. Dit concept is belangrijk om te begrijpen. Nu je begrijpt hoe de limieten van integers in elkaar zitten, kun je ook veel makkelijker het concept overflow begrijpen.

Overflow
Stel dat we in een 4-bit signed integer een waarde van 12 willen opslaan. Dat geeft een probleem, want zoals je hierboven ziet, bestaat die waarde helemaal niet in de reeks van mogelijke waarden. Het gevaar in bugs die op deze manier ontstaan, is dat er meestal gewoon een getal wordt opgeslagen. Alleen is dit helemaal niet het getal dat je wilde opslaan! Ga je hier vervolgens mee rekenen, dan klopt je antwoord niet meer!

Omdat we tegenwoordig veelal gebruik maken van 64-bit systemen, komt dit probleem steeds minder voor. Een unsigned integer heeft inmiddels een maximale waarde van 18446744073709551615 (ofwel 264 − 1) en een signed integer pakweg de helft daarvan: 9223372036854775807 (of -9223372036854775808). Het feit dat deze getallen inmiddels gigantisch zijn, wil niet zeggen dat het nooit meer problemen kan creëren, dus onthoud goed dat je te maken kan krijgen met deze limieten.

Integers in PHP
Als het gaat om PHP, is het bovenstaande niet per se van levensbelang. Zoals eerder benoemd, is PHP loose-typed, dus bepaalt hij zelf wat voor datatype een variabele heeft. Waar het wél belangrijk voor is, is de bijbehorende database. Je wilt tenslotte je resultaten wel opslaan en ook dan zul je rekening moeten houden met de limieten!



Reacties

Er zijn nog geen reacties.
 Meld je aan met LinkedIn om te reageren