繁体   English   中英

PHP 5.2和PHP 5.3中对大整数的按位运算

[英]Bitwise operations on big integers in PHP 5.2 and PHP 5.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

Windows 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的错误?

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

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

另外, PHP 5.3更新日志说:

更改浮点行为以在所有平台和所有编译器上始终使用双精度。 (Christian Seiler)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM