2010-02-21 7 views
5

Я очень смущен поведением функции сдвига влево в PHP. Я использую его на двух разных машинах (dev и хостинг), и они дают мне разные ответы. Я отслеживал его до этого расчета:PHP Left Shift дает два ответа на двух разных машинах

(-3941404251) << 5;

На одной машине я получаю ответ -1570884448; с другой стороны, я получаю 0. В обеих системах PHP_INT_MAX = 2147483647. Позднее это 32-разрядная система, а первая - 64-разрядная, хотя php работает как 32-битный процесс и по-прежнему дает тот же ответ.

Я могу только предположить, что это проблема с 32-битным и 64-битным, но есть ли простой способ получить желаемое поведение. Если кто-то может указать мне на функцию или что-то еще, это будет здорово.

Спасибо!

+0

ну, помещая эхо перед этим утверждением производит то же самое. (контекст не является проблемой). – Brendon

+0

@Sarfraz: он показывает свой код: '(-3941404251) << 5' ;;; @Brendon: Я воспроизвожу то, что вы описываете: 0 на 32 бита, и -1570884448 на 64 бит –

ответ

2

Первое значение - правильный ответ на вашу проблему. В официальном руководстве говорится, что вы не можете использовать побитовый оператор с номером больше max_int. Поэтому попробуйте использовать функции GMP (например, http://www.php.net/manual/en/function.gmp-and.php) и обрабатывать число как строку.

1

Являются ли машины использующими ту же версию PHP? (-3941404251) уже слишком велика для 32-битного знакового значения, поэтому я подозреваю, что «правильный» результат не определен, а разные версии/компиляции/etc, дающие разные результаты, не будут считаться ошибкой.

1

Вы можете использовать функции BC Math для преодоления целых ограничений. Это альтернатива ответу функции GMP от elq и, вероятно, лучше поддерживается.