32 Bit Integer in PHP , signed, unsigned und Umwandlung der Werte aus Dateien oder Strings

Beim Rechnen mit PHP-Integer-Zahlen ist das Vorzeichen zu beachten und Eingaben die als String vorliegen sind speziell umzurechnen

Zurücksetzen

Erläuterungen: Die Eingabe im Feld Uint32 kommt in PHP nicht etwa als Zahl an, sondern als String. Die Herausforderung besteht also darin, diesen String in einen vorzeichenlosen 32-Bit-Integer umzuwandeln, damit PHP aus diesem die dazugehörigen Bytes, 4 an der Zahl, berechnen kann. Ein Versuch:

$s = "4294967295"; # String!
printf("%X", $s);  # 7FFFFFFF

ergibt nämlich nicht das gewünschte Ergebnis sondern 7FFFFFFF, weil PHP die Eingabe ohne weiteres Zutun in einen vorzeichenbehafteten Integer umwandelt. Die Eingabe der Binary FF FF FF FF hingegen als Hexadezimal aufzufassen und in einen Dezimalwert umzurechnen ist nicht weiter kompliziert. Ganzzahlige Werte, Integer betrachtet PHP intern stets vorzeichenbehaftet. Maßgeblich für deren Maximalwert die sie Konstante PHP_INT_MAX, hier ist sie auf den Wert 9223372036854775807 gesetzt, PHP_INT_SIZE: 8.

Beispiel PHP_INT_MAX 2147483647

Mit o.g. Wert für PHP_INT_MAX ergibt es sich, daß Zahlen die größer sind als 2147483647 (0x7FFFFFFF) zu negativen Zahlen werden. Untenstehender Code veranschaulicht den Sachverhalt:

printf("signed: %d\nunsigned: %u\nhex: %X", 
    2147483648, 2147483648, 2147483648);

signed:   -2147483648
unsigned: 2147483648
hex:      80000000

printf("signed: %d\nunsigned: %u\nhex: %X", 
    2147483647, 2147483647, 2147483647);

signed:   2147483647
unsigned: 2147483647
hex:      7FFFFFFF

Dieser Umstand ist insbesondere dann beachtenswert wenn Zahlen als Binary vorliegen und der dazugehörige Dezimalwert wiederhergestellt werden soll. So batrachtet PHP die Binary FFFFFFFF schon als einen 32-Bit-Integer, gibt diesen jedoch als -1 aus:

$n = 0xFFFFFFFF;
printf("signed: %d\nunsigned: %u\nhex: %X", $n,$n,$n);

signed:   -1
unsigned: 4294967295
hex:      FFFFFFFF

Die print-Ausgabe -16 im nächsten Beispiel scheint verwirrend, PHP-intern wird jedoch mit dem richtigen Wert gerechnet, wie untenstehender Code zeigt:

$n = 0xFFFFFFFF << 4;
printf("signed: %d\nunsigned: %u\nhex: %X", $n,$n,$n);

signed:   -16
unsigned: 4294967280
hex:      FFFFFFF0

Schließlich seien noch die Funktionen gettype() und settype() erwähnt, dessen Verhalten ebenfalls durch den Wert in PHP_INT_MAX bestimmt wird.

Numerische Datentypen aus Dateien

Schreibt man in der Programmiersprache C einen numerischen Wert vom Datentyp Uint32 in eine Datei, ergeben sich genau 4 Bytes, deren Wertigkeiten genau dieselben sind, würde man die Perl-Ausgabe pack("N", $num); in eine Datei umleiten. Während man mit C und auch mit Perl den numerischen Werte eben als einen 32-Bit-Integer problemlos wiederherstellen kann, ergibt sich in PHP ohne weiteres Zutun jedoch ein vorzeichenbehafteter Integer der negativ wird, sofern er größer ist als 2147483647. Maßgeblich für diesen Schwellwert ist das erste Byte bzw. dessen Wertigkeit (0x7F, 127). In der Welt des Internet-Protocol sind das alle IP-Adressen die größer sind als 127.255.255.255 also ab 128.0.0.0.


Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de und wenn Sie möchten daß mein Prepaid nicht verfällt können Sie mich auch gerne anrufen 01625 26 40 76.