3

我将省略我是如何得出这个结论的细节,但重点是下面的代码在 PHP 5.2 x86 和 PHP 5.3 x86 上会产生不同的结果。

<?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;

结果是:

Linux x64,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

视窗 x86,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 的一个错误?

4

1 回答 1

4

当 PHP 遇到不适合 PHP_INT_MAX(x86 上为 32 位)的数字时,它会将数字转换为浮点数

如果 PHP 遇到超出整数类型范围的数字,它将被解释为浮点数。此外,导致数字超出整数类型范围的操作将改为返回浮点数。

此外,PHP 5.3 变更日志说:

将浮点行为更改为在所有平台和所有编译器上始终使用双精度。(克里斯蒂安·塞勒)

虽然我不能 100% 地向您确认这就是您所看到的原因,但我想这应该与它有关。

无论如何,如果您正在处理这些大数字,您应该停止依赖浮点精度并使用提供大数字支持的扩展,例如BC MathGMP

于 2012-07-09T21:03:42.557 回答