5

我对 PHP 的左移函数的行为感到非常困惑。我在两台不同的机器(开发和托管)上使用它,它们给了我不同的答案。我已经追踪到这个计算:

(-3941404251) << 5;

在一台机器上,我得到了答案-1570884448;另一方面,我得到 0。在两个系统上,PHP_INT_MAX = 2147483647。后者是 32 位系统,第一个是 64 位系统,尽管 php 作为 32 位进程运行并且仍然给出相同的答案。

我只能假设这是 32 位与 64 位的问题,但有没有简单的方法来获得所需的行为。如果有人可以向我指出一个功能或其他东西,那就太好了。

谢谢!

4

3 回答 3

2

第一个值是您问题的正确答案。官方手册说,您不能对大于 max_int 的数字使用按位运算符。所以尝试使用 GMP 函数(例如http://www.php.net/manual/en/function.gmp-and.php)并将数字视为字符串。

于 2010-02-21T14:42:15.420 回答
1

机器是否运行相同版本的 PHP?(-3941404251) 对于 32 位有符号值来说已经太大了,所以我怀疑“正确”的结果是未定义的,并且不同的版本/编译/等给出不同的结果不会被视为错误。

于 2010-02-21T13:24:37.820 回答
1

您可以使用BC 数学函数来克服整数限制。它是 elq 的 GMP 函数答案的替代方案,并且可能得到更好的支持。

于 2010-02-21T16:09:55.797 回答