Negation von Hex in PHP, lustiges Verhalten

9

Ich habe ein seltsames Verhalten, ich frage mich, ob jemand für mich aufräumen könnte.

Schau es dir an

%Vor%

Ausgaben

%Vor%

Wie erwartet.

Aber

%Vor%

Ausgaben

%Vor%

Warum schaltet das mittlere Bit nicht um, wenn $hex negiert ist?

    
Vigrond 08.03.2012, 20:02
quelle

2 Antworten

0

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.

    
Vigrond 11.03.2012, 20:09
quelle
-1

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.

    
Damp 08.03.2012 20:25
quelle

Tags und Links