PHP Left Shift дает два ответа на двух разных машинах - PullRequest
5 голосов
/ 21 февраля 2010

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

(-3941404251) << 5;

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

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 февраля 2010

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

1 голос
/ 21 февраля 2010

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

1 голос
/ 21 февраля 2010

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

...