Ich werde hier auf meine eigene Frage eingehen.
Ja, das ist eine 32-Bit / 64-Bit-Differenz.
In 32-Bit-Systemen muss ein Float-Typ zwei Speicherbereiche belegen, um die erforderlichen 64 Bit zu erhalten. PHP verwendet Double-Precision (siehe Ссылка )
$ hex wird als Float-Typ ausgewertet. Intval und Decbin-Funktionen konvertieren dies in einen int-Typ (1. Beispiel oben)
Im zweiten Beispiel verwenden wir den nicht bitweisen Operator, BEVOR wir decbin verwenden. Dadurch werden zuerst die Bits im Double-Precision-Float mit zwei Speicherplätzen umgedreht und dann in Int Second konvertiert. Gab uns etwas anderes, als wir erwartet hatten.
Tatsächlich, wenn wir das Negat innerhalb des intval () wie folgt setzen:
%Vor%Wir bekommen
%Vor%Als Ausgabe.
Ich bin nicht gut genug, um dies mit Mathematik zu beweisen (was mit Hilfe dieses Artikels herausgefunden werden kann Ссылка ). Aber vielleicht wenn ich später Zeit habe --_-
Ich denke, es ist sehr wichtig zu lernen, wie Zahlen in Computern dargestellt werden, so dass wir Anomalien wie diese verstehen und sie nicht als Fehler bezeichnen können.
Möglicherweise ein Fall, der darunter fällt:
Von der php Bitwise-Operator-Seite Ссылка
Der NOT- oder Komplementoperator (~) und negative Binärzahlen können verwirrend sein.
~ 2 = -3, weil Sie die Formel verwenden ~ x = -x - 1 Die bitweise Komplement einer Dezimalzahl ist die Negation der Zahl minus 1.
HINWEIS: Verwenden Sie hier nur 4 Bits für die folgenden Beispiele, aber in Wirklichkeit PHP verwendet 32 Bits.
Die Umwandlung einer negativen Dezimalzahl (dh: -3) in Binärwerte dauert 3 Schritte: 1) wandle die positive Version der Dezimalzahl in binär (dh: 3 = 0011) 2) kippt die Bits um (dh: 0011 wird zu 1100) 3) addiere 1 (dh: 1100 + 0001 = 1101)
Sie fragen sich vielleicht, wie 1101 = -3. Nun, PHP verwendet die Methode "Zweierkomplement", um negative Binärzahlen zu rendern. Wenn links am meisten Bit ist eine 1, dann ist die Binärzahl negativ und Sie kippen die Bits und addiere 1. Wenn es 0 ist, dann ist es positiv und du musst es nicht tun etwas. Also wäre 0010 ein positiver 2. Wenn es 1101 ist, ist es negativ und du drehst die Bits, um 0010 zu erhalten. Addiere 1 und du erhält 0011, was gleich ist -3.