Beim Rechnen mit PHP-Integer-Zahlen ist das Vorzeichen zu beachten und Eingaben die als String vorliegen sind speziell umzurechnen
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
.
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.
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. sos@rolfrost.de und wenn Sie möchten daß mein Prepaid nicht verfällt können Sie mich auch gerne anrufen 01625 26 40 76.