2012-07-09 63 views
3

我将省略详细的介绍,但重点是下面的代码在PHP 5.2 x86和PHP 5.3 x86上产生不同的结果。在PHP 5.2和PHP 5.3中对大整数进行按位运算

<?php 

$result = (((-1035721791 + -2004767255)^3402727701) + 4148612726)^-759268493; 
echo 'Platform: ' . php_uname(), PHP_EOL; 
echo 'PHP version: ' . PHP_VERSION, PHP_EOL; 
echo 'Max integer: ' . PHP_INT_MAX, PHP_EOL; 
echo 'Result: ' . $result, PHP_EOL; 

的结果是:

64位的Linux,PHP 5.3

Platform: Linux Test1 3.2.0-25-generiC#40-Ubuntu SMP Wed May 23 20:30:51 UTC 2012 x86_64 
PHP version: 5.3.10-1ubuntu3.2 
Max integer: 9223372036854775807 
Result: -1511693242 

Linux x86上,PHP 5.3

Platform: Linux Test2 2.6.32-5-686 #1 SMP Sun May 6 04:01:19 UTC 2012 i686 
PHP version: 5.3.3-7+squeeze9 
Max integer: 2147483647 
Result: -1511693242 

的Windows 86,PHP 5.3

Platform: Windows NT Test3 6.1 build 7600 i586 
PHP version: 5.3.6 
Max integer: 2147483647 
Result: -1511693242 

Linux x86上,PHP 5.2

Platform: Linux Test4 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 
PHP version: 5.2.10 
Max integer: 2147483647 
Result: -1868155656 

最后的结果是,其余为一些未知的对我的理由不同。

如您所见,表达式-1035721791 + -2004767255的结果不适合int32,但PHP 5.3在x86和x64平台上产生相同的结果。而PHP 5.2在x86上产生不正确的结果。

是否记录了这种差异?它是PHP的一个功能还是PHP 5.2的一个bug?

回答

4

当PHP遇到了一些不适合在PHP_INT_MAX(在x86 32位),it will convert the number into a float

如果PHP遇到一个数超出了整数类型的边界,它 将被解释为一个代之以浮动。此外,如果操作超出整数类型的范围,则返回 而不是float。

此外,PHP 5.3 changelog说:

改变浮点行为一直使用双精度 在所有平台上,并与所有的编译器。 (Christian Seiler)

虽然我无法确定你100%这是你所看到的原因,但我认为它应该与它有关。

无论如何,如果你正在处理那些五花八门的大数字,你应该停止依靠浮点精度和使用的延伸,提供了大量的支持,而不是如BC MathGMP

+0

+1:数字'3402727701'和“4148612726”超过了32位有符号整数表示。 – wallyk 2012-07-09 21:06:48

+0

使用浮动或双打执行xor操作不可能是预期的。 – wallyk 2012-07-09 21:08:00

+0

其实它不是我自己的代码,它是[Crypt_Blowfish](http://pear.php.net/package/Crypt_Blowfish)PEAR软件包,我有一个问题,升级到PHP 5.3后,在PHP 5.2上加密的数据变得无效。 我使用它的最新稳定版本1.0.1,似乎像这样的问题解决了进一步发布。但即使我升级了库,现有的加密数据仍然与正确的实现不兼容。 – 2012-07-10 08:58:04