最新版本: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 許可證獲得許可。