phpcommon/intmath

一个用于整数运算的库,当溢出时会在内部进行回绕。

1.0.0-beta 2016-07-03 23:02 UTC

This package is auto-updated.

Last update: 2024-09-19 00:02:57 UTC


README

Build Status Code Coverage Scrutinizer Code Quality StyleCI Latest Stable Version Dependency Status

最新版本: 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));

如前所示,将一个加到原生算术运算符支持的最大整数上,将得到一个浮点数。相比之下,使用 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

有关详细信息,请参阅测试文档

贡献

欢迎为该软件包做出贡献!

  • 问题跟踪器上报告您发现的任何错误或问题。
  • 您可以在软件包的Git仓库中获取源代码。

请参阅贡献指南行为准则以获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件marcos@marcospassos.com而不是使用问题跟踪器来报告。

致谢

许可证

本软件包的所有内容均受MIT许可证许可。