1. Datentyp Zahlen
Wenn man in seinen PHP-Skripten mit Variablen(inhalten) rechnen möchte muss man dazu einen Datentyp benutzen der dazu dient Zahlen darzustellen. Eine naive Möglichkeit ist es die Zahlen in Strings zu schreiben und damit zu rechnen.
<?php
echo "5"+"9";
?>
Dies gibt wie erwartet 14
aus. Hier haben wir jedoch Strings miteinander
addiert. In der Regel klappt dies nicht, hier hat jedoch Typecasting
zugeschlagen und die Strings vorher in echte Zahlen umgewandelt. Für Zahlen
gibt es in PHP zwei Datentypen. Dies sind einmal Integer-Zahlen
und einmal Float-Zahlen.
2. Integer-Zahlen
Integer-Zahlen sind ganzzahlige Werte, enthalten also kein Nachkommastellen. Beispiele
sind 5
, 31
oder 199
, aber auch negative Zahlen wie
-1
, -10
oder -44
. In PHP schreibt man Integer-Zahlen
einfach in den Quelltext, der PHP-Interpreter erkennt diese Ziffernfolge als Zahl.
<?php
$var = 5;
$var2 = 31;
$var3 = -10;
?>
Es ist auch möglich Integer-Zahlen in Hexadezimaler- und Oktaler-Notation anzugeben, wenn
man denn die Umrechnung im Kopf hat. Für die hexadezimaler Schreibweise verwendet man den
Präfix 0x
, für die oktaler Schreibweise hingegen nur den Präfix 0
(normale Integer-Zahlen starten direkt mit der höchsten Ziffer oder sind
eh nur die Zahl 0).
<?php
$var = 0xFF; // hexadezimal (255), oft bei protokollen verwendet
$var2 = 0763; // octal (499), oft bei chmod verwendet
$var3 = 0; // normale null, hier ist es eh egal ob hex-, oct- oder dezimal
?>
3. Float-Zahlen
Float-Zahlen sind Werte mit Nachkommastellen, Beispiele davon sind 5.7
,
12.25
oder -4.07
, aber auch 10.0
, 3.1E-10
oder 4.5e3
.
<?php
$var = 5.7;
$var2 = 3.1E-10;
$var = .1;
?>
Float-Zahlen erkennt man an den Dezimalpunkt .
, des Weiteren wird nicht
ein Kommata (,
) für die Nachkommastellen verwendet. Da der Punkt jedoch auch
für die String-Verkettung benutzt wird muss man hier ein wenig aufpassen, wenn man
Float-Zahlen mit Strings verketten will. Notfalls ist es nötig Klammern zu verwenden.
<?php
echo 'Prozentualer Anteil:'.77.3.'%'; // wird nicht klappen
echo 'Prozentualer Anteil:'.(77.3).'%'; // klappt
echo 'Prozentualer Anteil:'. 77.3 .'%'; // klappt, die Leerzeichen "helfen" hier php beim parsen
?>
4. Speicherverwaltung von Integer- und Float-Zahlen
Nun fragt man sich warum es Integer- und Float-Zahlen gibt wo doch Float-Zahlen
mehr können. Die Verwendung und die Logik in der Speicherung beider
Datentypen ist jedoch eine andere. Integer-Zahlen werden z.B. relativ
einfach abgespeichert. Nehmen wir an eine Integer-Zahl soll in ein 64 Bit
Feld gespeichert werden. Davon geht dann schonmal 1 Bit für das Vorzeichen
drauf (mehr oder weniger, hat was mit Zweierkomplement
zu tun). Die restlichen 63 Bits stehen dann für eine bestimmte
Wertigkeit. Wenn an den Bits eine 1
steht so besitzt
diese Integer-Zahl diese Wertigkeit. Die Summe aller Wertigkeiten die
gesetzt sind bilden dann den Betrag der Zahl und mit dem Vorzeichenbit
wird dann die komplette Zahl dargestellt. Die Wertigkeit startet dabei
von 2^0
(1) und geht bis 2^62
(4611686018427387904).
Die Zahl 50 wird z.B. in die Wertigkeiten 32, 16 und 2 aufgeteilt (wie man sieht
sind das Zweierpotenzen). Auf Bits runtergerechnet sind das die Bits
1 (2^1 = 2), 4 (2^4 = 16) und 5 (2^5 = 32). Diese werden dann in dem 64 Bit
Feld gesetzt.
Integer-Zahlen werden jedoch üblicherweise Trickreicher im sog. Zweierkomplement abgespeichert.
Bei den Float-Zahlen geht man einen anderen Weg. Da sie auch Nachkommastellen speichern können können wir solche Wertigkeiten erstmal nicht benutzen. Float-Zahlen werden in den IEEE 754 Standard gespeichert. Z.b. werden von den 32 Bits 1 Bit fürs Vorzeichen verwendet, 8 Bits für den Exponent und 23 Bits für die Mantisse. Zuerst wird mit der Mantisse eine Nachkommazahl dargestellt, die mehr oder weniger zwischen 0 und 1 liegt. Dann wird zu dieser Zahl eine 2er Potenz draufmultipliziert. Der Exponent wird dabei aus den 8 Bits gebildet. Je nach verwendeten Standard wird diese Mantisse, die zwischen 0 und 1 liegt, nach links (wenn der Faktor sehr groß ist, z.B. 2^50) oder nach rechts (wenn der Faktor sehr klein ist, z.B. 2^-50) verschoben. Mit dem Vorzeichenbit endsteht dann eine komplette Zahl. Letzendlich kann man also nicht jede beliebige Kommazahl darstellen sondern nur einen bestimmten Bereich der Kommazahl, da man nur einen 6-7 Ziffern großen Nachkommawert hin und her verschiebt. Für die meisten Sachen reicht diese Idee, in der Mathematik macht man es ja auch nicht anders (der LKW wiegt 31,6 Tonnen statt 31,6453903197 Tonnen).