phpcommon / intmath
一个用于整数运算的库,当溢出时会在内部进行回绕。
Requires
- php: ^5.3.0|^7.0
Requires (Dev)
- php: ^5.6|^7.0
- phpunit/phpunit: ~5.4
- scrutinizer/ocular: ~1.1
- squizlabs/php_codesniffer: ~2.3
This package is auto-updated.
Last update: 2024-09-19 00:02:57 UTC
README
最新版本: 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
有关详细信息,请参阅测试文档。
贡献
欢迎为该软件包做出贡献!
安全
如果您发现任何与安全相关的问题,请通过电子邮件marcos@marcospassos.com而不是使用问题跟踪器来报告。
致谢
许可证
本软件包的所有内容均受MIT许可证许可。