PHP_INT_MAX, kein PHP_INT_MIN und ein WTF

Bei der Prüfung von Usereingaben sollte man Zahlen auch dahingehend vergleichen, ob diese auch noch überhaupt im erlaubten Bereich liegen.

Nach oben kein Problem

Ob eine Zahl zu gross wird kann man relativ leicht mit PHP-Bordmitteln feststellen.


if (PHP_INT_MAX<=$meineZahl) {
//...
}>

Damit läßt sich schnell und einfach feststellen, ob eine Zahl den erlaubten Integer-Höchstwert von 2147483647 übertrifft oder eben nicht.

Interessant ist übrigens, dass Zahlen, die über PHP_INT_MAX hinausgehen zu einem Float werden – somit könnte man auch entsprechend den Datentyp vergleichen und darüber dann eine Schlussfolgerung ziehen. Man kann weiterhin ganz normale Größenvergleiche durchführen, allerdings sollte man bei der Nutzung von Filterfunktionen aufpassen:


$ergebnis = filter_var($variable,FILTER_SANITIZE_NUMBER_INT);

Das Beispiel liefert dann keinen Integer mehr, sobald $variable größer PHP_INT_MAX wird und somit könnten entsprechende Vergleiche fehlschlagen.

Eine entsprechende Max-Funktion für Float – PHP_FLOAT_MAX – gibt es leider nicht.

Ein Blick nach unten

Nun könnte man meinen, es gäbe auch ein PHP_INT_MIN, doch #meep#, leider nicht. Warum auch immer: Es gibt keine entsprechende Min-Funktion für Integer!

Kurios wird auch das verhalten des Typs, wenn man sich der Untergrenze des Int-Bereiches nähert. Während man nach oben recht einfach prüfen kann, ob man sich im normalen Bereich aufhält – ob nun durch PHP_INT_MAX oder eine Typprüfung auf int bzw. float – ist das im negativen Zahlenbereich so eine Sache, aber erstmal etwas Code:


$minzahl = -2147483647;
var_dump($minzahl);
var_dump($minzahl-1);

$minzahl = -2147483648;
var_dump($minzahl);
var_dump($minzahl-1);

Das Ergebnis?


int(-2147483647)
int(-2147483648)

float(-2147483648)
float(-2147483649)

Wie man sieht, ist sich PHP nicht so ganz einig, welchen Datentyp denn nun die Zahl –2147483648 hat, Integer oder Float – vielmehr kann in diesem Grenzbereich auch keine Aussage treffen, ob man nun den Bereich unterschreitet oder nicht – zumindest nicht ohne Zuhilfenahme einer Konstanten.

6 Gedanken zu „PHP_INT_MAX, kein PHP_INT_MIN und ein WTF

  1. Anonymous

    Ich halte nicht viel davon die Größen zu überprüfen. Was soll denn passieren? Magic PHP macht dir aus einem Integer einen Float oder einfach einen String? Wenn interessiert es. PHP macht das doch ziemlich gut.

    Negativen Bereich für einen signed Integer in PHP? 2^31-1 bzw. 2^63-1 oder auch PHP_INT_MAX*-1. Wobei PHP hier wirklich witzig ist, denn normalerweise sollte es dochbis -2^31 bzw. 2^63 gehen.

    Antworten
  2. Martin Naatz

    Wieso sollte man PHP_INT_MIN als extra Konstante benötigen, wo es sich doch einfach als ~PHP_INT_MAX schreiben lässt? (Was rechnerisch tatsächlich (-PHP_INT_MAX – 1) ergibt.)

    Antworten
  3. Gast

    Da floats genauso groß wie integer sind, ist eine Konstante wie PHP_FLOAT_MAX unnötig. Wenn, dann wäre PHP_FLOAT_MAX == PHP_INT_MAX.

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert