2010-02-21 23 views
5

Estoy muy confundido acerca del comportamiento de la función de desplazamiento izquierdo de PHP. Lo estoy usando en dos máquinas diferentes (desarrollo y hosting), y me están dando respuestas diferentes. He rastreado hacia abajo para este cálculo:PHP Shift Shift dando dos respuestas en dos máquinas diferentes

(-3941404251) << 5;

En una máquina que estoy recibiendo la respuesta -1570884448; por el otro, obtengo 0. En ambos sistemas, PHP_INT_MAX = 2147483647. El último es un sistema de 32 bits, y el primero de 64 bits, aunque php se ejecuta como un proceso de 32 bits y aún da la misma respuesta.

Solo puedo suponer que esto es un problema con 32 bits frente a 64 bits, pero ¿hay alguna manera fácil de obtener el comportamiento deseado. Si alguien pudiera indicarme una función o algo así, sería genial.

Gracias!

+0

bien, poner echo en frente de esa declaración produce lo mismo. (el contexto no es el problema). – Brendon

+0

@Sarfraz: ha mostrado su código: '(-3941404251) << 5' ;;; @Brendon: reproduzco lo que describes: 0 en 32 bits y -1570884448 en 64 bits –

Respuesta

2

El primer valor es la respuesta correcta para su problema. El manual oficial dice que no se puede usar un operador bit a bit en un número mayor que max_int. Intente utilizar funciones GMP (por ejemplo, http://www.php.net/manual/en/function.gmp-and.php) y trate el número como una cadena.

1

¿Las máquinas ejecutan la misma versión de PHP? (-3941404251) ya es demasiado grande para un valor firmado de 32 bits, por lo que sospecho que el resultado "correcto" no está definido y las diferentes versiones/compilaciones/etc. que dan resultados diferentes no se considerarán un error.

1

Puede usar las funciones BC Math para superar las limitaciones enteras. Es una alternativa a la respuesta de la función GMP de elq, y probablemente sea mejor respaldada.

Cuestiones relacionadas