2010-02-21 8 views
5

Ich bin sehr verwirrt über das Verhalten der Linkshänder-Funktion von PHP. Ich benutze es auf zwei verschiedenen Maschinen (Dev und Hosting), und sie geben mir verschiedene Antworten. Ich habe es zu dieser Berechnung aufgespürt:PHP Left Shift gibt zwei Antworten auf zwei verschiedene Maschinen

(-3941404251) << 5;

Auf einer Maschine erhalte ich die Antwort -1570884448; Zum anderen bekomme ich 0. Auf beiden Systemen PHP_INT_MAX = 2147483647. Das spätere ist ein 32-Bit-System, und das erste ein 64-Bit, obwohl PHP als 32-Bit-Prozess läuft und immer noch die gleiche Antwort gibt.

Ich kann nur davon ausgehen, dass dies ein Problem mit 32-Bit-vs 64-Bit ist, aber gibt es eine einfache Möglichkeit, das gewünschte Verhalten zu erhalten. Wenn mich jemand auf eine Funktion oder etwas hinweisen könnte, wäre das großartig.

Danke!

+0

Nun, das Echo vor dieser Aussage zu erzeugen, erzeugt das Gleiche. (Kontext ist nicht das Problem). – Brendon

+0

@Sarfraz: er hat seinen Code gezeigt: '(-3941404251) << 5' ;;; @ Brendon: Ich reproduzieren, was Sie beschreiben: 0 auf 32 Bits und -1570884448 auf 64 Bits –

Antwort

2

Der erste Wert ist die richtige Antwort für Ihr Problem. Das offizielle Handbuch sagt, dass Sie den bitweisen Operator nicht für eine Zahl größer als max_int verwenden können. Versuchen Sie also, GMP-Funktionen zu verwenden (z. B. http://www.php.net/manual/en/function.gmp-and.php) und behandeln Sie die Nummer als Zeichenfolge.

1

Funktionieren die Maschinen mit der gleichen PHP-Version? (-3941404251) ist bereits zu groß für einen 32-Bit-Wert mit Vorzeichen, daher vermute ich, dass das "korrekte" Ergebnis undefiniert ist und dass verschiedene Versionen/Kompilierungen/etc, die unterschiedliche Ergebnisse liefern, nicht als Fehler betrachtet werden.

1

Sie können die Funktionen BC Math verwenden, um die ganzzahligen Einschränkungen zu umgehen. Es ist eine Alternative zur elq GMP-Funktion Antwort und wahrscheinlich besser unterstützt.