PHP Left Shift дает два ответа на двух разных машинах

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

(-3941404251) << 5;

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

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

Спасибо!


person Brendon    schedule 21.02.2010    source источник
comment
ну, поместив echo перед этим утверждением, вы получите то же самое. (контекст не имеет значения).   -  person Brendon    schedule 21.02.2010
comment
@Sarfraz: он показал свой код: (-3941404251) << 5 ;;; @ Брендон: я воспроизвожу то, что вы описываете: 0 для 32 бит и -1570884448 для 64 бит.   -  person Pascal MARTIN    schedule 21.02.2010


Ответы (3)


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

person Community    schedule 21.02.2010

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

person andrewffff    schedule 21.02.2010

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

person Xorlev    schedule 21.02.2010