2010-02-21 24 views
5

Sono molto confuso dal comportamento della funzione di spostamento a sinistra di PHP. Lo sto usando su due macchine diverse (dev e hosting), e mi stanno dando risposte diverse. Ho rintracciato giù a questo calcolo:PHP Left Shift con due risposte su due macchine diverse

(-3941404251) << 5;

Su una macchina che sto ricevendo la risposta -1.570,884448 millions; dall'altra, ottengo 0. Su entrambi i sistemi, PHP_INT_MAX = 2147483647. Il più tardi è un sistema a 32 bit, e il primo a 64 bit, anche se php è in esecuzione come processo a 32 bit e dà ancora la stessa risposta.

Posso solo supporre che questo sia un problema con 32-bit vs 64-bit, ma esiste un modo semplice per ottenere il comportamento desiderato. Se qualcuno potesse indicarmi una funzione o qualcosa del genere, sarebbe fantastico.

Grazie!

+0

bene, mettere l'eco di fronte a tale affermazione produce la stessa cosa. (contesto non è il problema). – Brendon

+0

@Sarfraz: ha mostrato il suo codice: '(-3941404251) << 5' ;;; @Brendon: riproduco ciò che descrivi: 0 su 32 bit e -1570884448 su 64 bit –

risposta

2

Il primo valore è la risposta corretta per il tuo problema. Il manuale ufficiale dice che non è possibile utilizzare l'operatore bit a bit su un numero maggiore di max_int. Quindi provare a utilizzare le funzioni GMP (ad esempio http://www.php.net/manual/en/function.gmp-and.php) e trattare il numero come una stringa.

1

Le macchine utilizzano la stessa versione di PHP? (-3941404251) è già troppo grande per un valore con segno a 32 bit, quindi sospetto che il risultato "corretto" non sia definito e diverse versioni/compilazioni/ecc. Che danno risultati diversi non siano considerati un bug.

1

È possibile utilizzare le funzioni BC Math per superare i limiti di numero intero. È un'alternativa alla risposta della funzione GMP di elq e probabilmente è meglio supportata.

Problemi correlati