最新版本:1.0.0-beta
PHP 5.3+ 库,用于对溢出时回绕的整数进行算术运算。
注意力
该库并非旨在用作对整数正确执行算术运算的方式,并且不应用于代替本机算术运算符或为此目的设计的任何其他库。
与其他将大正整数溢出为大负整数的语言不同,PHP 实际上将整数溢出为浮点数。在大多数情况下,算术溢出必须被视为需要特殊处理的异常情况。然而,在某些情况下,这种环绕行为实际上是有用的 - 例如 TCP 序列号或某些算法(例如哈希计算)。该实用程序类提供了根据该行为进行操作的基本算术函数。
为了说明这一点,请考虑以下示例:
// Output on 64-bit system: float(9.2233720368548E+18)
var_dump ( PHP_MAX_INT + 1 );
// Output on 64-bit system: int(-9223372036854775808)
var_dump (IntMath:: add ( PHP_MAX_INT , 1 ));
如前所述,使用本机算术运算符将 1 与支持的最大整数相加将得到浮点数。相比之下,使用 IntMath::add() 将导致溢出,从而导致此 PHP 版本支持的最小整数。
该 API 在源代码中进行了详细记录。此外,还提供 HTML 版本,以便更方便地在浏览器中查看。
使用 Composer 安装包:
$ composer require phpcommon/intmath
目前仅支持四种基本算术运算(加、减、乘、除)和求反。
对于整数值,求反与从零减法相同。由于 PHP 对整数使用补码表示,并且补码值的范围不对称,因此最大负整数的求反会得到相同的最大负数。尽管发生了溢出,但没有抛出异常。
对于所有整数值$a
, -$a
等于(~$a) + 1
。
API使用示例:
// Outputs int(-100)
var_dump (IntMath:: negate ( 100 ));
两个整数相加的结果是以足够宽的补码格式表示的真实数学结果的低位。如果发生溢出,则结果的符号可能与两个值的数学和的符号不同。尽管发生溢出,但在这种情况下不会引发异常。
API使用示例:
// Outputs int(300)
var_dump (IntMath:: add ( 100 , 200 ));
正数的减法与相同大小的负数的加法产生相同的结果。此外,从零减去与求反相同。结果是以足够宽的二进制补码格式表示的真实数学结果的低位。如果发生溢出,则结果的符号可能与两个值的数学差的符号不同。尽管发生溢出,但在这种情况下不会引发异常。
API使用示例:
// Outputs int(90)
IntMath:: subtract ( 100 , 10 );
两个整数相乘的结果是以足够宽的补码格式表示的真实数学结果的低位。如果发生溢出,则结果的符号可能与两个值的数学乘积的符号不同。尽管发生溢出,但在这种情况下不会引发异常。
API使用示例:
// Outputs int(200)
IntMath:: multiply ( 100 , 2 );
除法将结果四舍五入到零。因此,结果的绝对值是小于或等于两个操作数的商的绝对值的最大可能整数。当两个操作数具有相同符号时,结果为零或正;当两个操作数具有相反符号时,结果为零或负。
有一种特殊情况不满足此规则:如果被除数是其类型中可能最大的负整数,并且除数为-1
,则会发生整数溢出,结果等于被除数。尽管发生溢出,但在这种情况下不会引发异常。另一方面,如果整数除法中除数的值为0
,则抛出DivisionByZeroException
。
API使用示例:
// Outputs int(50)
IntMath:: divide ( 100 , 2 );
请参阅变更日志以了解最近更改的更多信息。
$ composer test
查看测试文档以获取更多详细信息。
随时欢迎对包做出贡献!
有关详细信息,请参阅贡献和行为。
如果您发现任何与安全相关的问题,请发送电子邮件至 [email protected],而不是使用问题跟踪器。
该软件包的所有内容均根据 MIT 许可证获得许可。