In der PHP -Sprache verwechseln einige Ergebnisse bei der Durchführung von Formpicker (Modulo Division) Anfänger. Zum Beispiel ist das Ergebnis beispielsweise bei 8% -3 tatsächlich 0. Auf den ersten Blick scheint dies der Intuition oder dem mathematischen gesunden Menschenverstand zu widersprechen, da 8 nicht durch 3 geteilt werden kann und es einen Rest geben sollte. Warum kehrt PHP 0 zurück?
Der modulare Operator ( % ) wird verwendet, um den Rest nach zwei Zahlen zurückzugeben. Syntaktisch ist sein Ausdruck:
<span class="fun">a % b = a - b * floor (a / b)</span>
Es ist zu beachten, dass in PHP das Ergebnissymbol des Modulo -Betriebs immer mit dem Modulo (dem ersten Operanden) übereinstimmt . Dies kann sich vom Verhalten in einigen anderen Sprachen wie Python oder Java unterscheiden.
Zum Beispiel:
echo 8 % 3; // Ausgabe 2
echo 8 % -3; // Ausgabe 2
echo -8 % 3; // Ausgabe -2
echo -8 % -3; // Ausgabe -2
Es ist ersichtlich, dass das Ergebnis positiv ist, egal ob der Divisor (der zweite Operand) positiv oder negativ ist, solange der Modul positiv ist. Wenn der Modul negativ ist, ist das Ergebnis negativ.
Ganzzahlen im PHP verwenden signierte ganze Zahlen, dh Ganzzahlen können positiv oder negativ sein. Die zugrunde liegende Darstellung erfolgt normalerweise in Form von Two's Komplement.
Zum Beispiel:
8 -> Binäre Darstellung:00000000 00000000 00000000 00001000
-3 -> Binäre Darstellung:11111111 11111111 11111111 11111101
Wenn 8% -3 ausgeführt wird, verwendet PHP die oben genannte Formel, um zu berechnen:
8 % -3 = 8 - (-3) * floor(8 / -3)
= 8 - (-3) * (-3)
= 8 - 9
= -1
Überraschenderweise gibt PHP dieses mathematische Ergebnis -1 nicht zurück, sondern 2 . Dies liegt daran, dass die PHP -Implementierung den Modulbetrieb so anpasst, dass die verbleibenden Zahlensymbole mit dem Modul übereinstimmen.
Dieser Teil ist der wahre verwirrende Punkt. In einigen PHP -Versionen oder unter bestimmten Bedingungen kann ein Ergebnis von 8% -3 == 0 auftreten.
Tatsächlich ist dies normalerweise eine Grenzsituation, die durch interne Typumwandlungen, plattformspezifisches Verhalten oder den Kontext von Ausdrücken verursacht wird. Es ist darauf hinzuweisen, dass 8% -3 unter normalen Umständen 2 anstelle von 0 zurückgeben sollte.
Wenn Sie in einigen Umgebungen 8% -3 == 0 sehen, wird empfohlen, die PHP -Version, die Plattformarchitektur und die implizite Konvertierung oder andere kontextbezogene Interferenzen zu bestätigen.
Das Verständnis der Implementierungsdetails von Modulo -Operationen in PHP hilft uns, Code vernünftiger zu schreiben. Wenn Sie beispielsweise spezifische Anforderungen haben, wenn Sie sich mit positivem und negativem Modulo befassen, können Sie benutzerdefinierte Funktionen verwenden, um die symbolische Konsistenz der Ergebnisse zu gewährleisten.
function mod($a, $b) {
return ($b < 0 ? -1 : 1) * ($a % abs($b));
}
Auf diese Weise können Sie die positiven und negativen Anzeichen des Ergebnisses besser kontrollieren und Plattformunterschiede oder Inkonsistenzen durch PHP -Versionen vermeiden.
Obwohl das Phänomen von 8% -3, die 0 in PHP zurückgibt, verwirrend erscheint, solange Sie die Modulo -Betriebsregeln von PHP, signierte ganzzahlige Repräsentationsmethoden und die zugrunde liegende Implementierung des Modulo -Betriebs, verstehen, können Sie die Logik darin verstehen. In der tatsächlichen Entwicklung sollten Entwickler Modulo -Operationen nach bestimmten Szenarien sorgfältig verwenden und die Kompatibilität und die Vorhersehbarkeit berücksichtigen, um logische Fehler zu vermeiden.