Neueste Version: 1.0.0-Beta
PHP 5.3+-Bibliothek für arithmetische Operationen mit ganzen Zahlen, die bei Überlauf umgebrochen wird.
Aufmerksamkeit
Diese Bibliothek ist nicht für die ordnungsgemäße Durchführung arithmetischer Operationen mit ganzen Zahlen gedacht und sollte nicht anstelle der nativen arithmetischen Operatoren oder anderer für diesen Zweck entwickelter Bibliotheken verwendet werden.
Im Gegensatz zu anderen Sprachen, die große positive ganze Zahlen in große negative ganze Zahlen überlaufen lassen, überläuft PHP tatsächlich ganze Zahlen in Gleitkommazahlen. In den meisten Fällen müssen arithmetische Überläufe als ungewöhnlicher Umstand behandelt werden, der eine besondere Behandlung erfordert. Es gibt jedoch einige Fälle, in denen ein solches Wrap-Around -Verhalten tatsächlich nützlich ist – beispielsweise bei TCP-Sequenznummern oder bestimmten Algorithmen, wie etwa der Hash-Berechnung. Diese Dienstprogrammklasse stellt grundlegende arithmetische Funktionen bereit, die diesem Verhalten entsprechen.
Betrachten Sie zur Veranschaulichung das folgende Beispiel:
// 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 ));
Wie bereits gezeigt, führt die Addition von eins zur größten Ganzzahl, die mit nativen arithmetischen Operatoren unterstützt wird, zu einer Gleitkommazahl. Im Gegensatz dazu führt die Verwendung von IntMath::add() zu einem Überlauf, der zur kleinsten Ganzzahl führt, die in diesem PHP-Build unterstützt wird.
Die API ist ausführlich im Quellcode dokumentiert. Darüber hinaus steht auch eine HTML-Version zur komfortableren Anzeige im Browser zur Verfügung.
Verwenden Sie Composer, um das Paket zu installieren:
$ composer require phpcommon/intmath
Derzeit werden nur die vier Grundrechenarten (Addition, Subtraktion, Multiplikation und Division) sowie die Negation unterstützt.
Bei ganzzahligen Werten ist die Negation dasselbe wie die Subtraktion von Null. Da PHP die Zweierkomplementdarstellung für ganze Zahlen verwendet und der Bereich der Zweierkomplementwerte nicht symmetrisch ist, führt die Negation der maximalen negativen Ganzzahl zu derselben maximalen negativen Zahl. Trotz der Tatsache, dass ein Überlauf aufgetreten ist, wird keine Ausnahme ausgelöst.
Für alle ganzzahligen Werte $a
ist -$a
gleich (~$a) + 1
.
API-Beispielverwendung:
// Outputs int(-100)
var_dump (IntMath:: negate ( 100 ));
Das Ergebnis der Addition zweier Ganzzahlen sind die niederwertigen Bits des wahren mathematischen Ergebnisses, dargestellt in einem ausreichend breiten Zweierkomplementformat. Tritt ein Überlauf auf, stimmt das Vorzeichen des Ergebnisses möglicherweise nicht mit dem Vorzeichen der mathematischen Summe der beiden Werte überein. Trotz des Überlaufs wird in diesem Fall keine Ausnahme ausgelöst.
API-Beispielverwendung:
// Outputs int(300)
var_dump (IntMath:: add ( 100 , 200 ));
Die Subtraktion einer positiven Zahl führt zum gleichen Ergebnis wie die Addition einer negativen Zahl gleicher Größe. Darüber hinaus ist die Subtraktion von Null dasselbe wie die Negation. Das Ergebnis sind die niederwertigen Bits des wahren mathematischen Ergebnisses, dargestellt in einem ausreichend breiten Zweierkomplementformat. Tritt ein Überlauf auf, stimmt das Vorzeichen des Ergebnisses möglicherweise nicht mit dem Vorzeichen der mathematischen Differenz der beiden Werte überein. Trotz des Überlaufs wird in diesem Fall keine Ausnahme ausgelöst.
API-Beispielverwendung:
// Outputs int(90)
IntMath:: subtract ( 100 , 10 );
Das Ergebnis der Multiplikation zweier Ganzzahlen sind die niederwertigen Bits des wahren mathematischen Ergebnisses, dargestellt in einem ausreichend breiten Zweierkomplementformat. Tritt ein Überlauf auf, stimmt das Vorzeichen des Ergebnisses möglicherweise nicht mit dem Vorzeichen des mathematischen Produkts der beiden Werte überein. Trotz des Überlaufs wird in diesem Fall keine Ausnahme ausgelöst.
API-Beispielverwendung:
// Outputs int(200)
IntMath:: multiply ( 100 , 2 );
Die Division rundet das Ergebnis gegen Null. Somit ist der Absolutwert des Ergebnisses die größtmögliche ganze Zahl, die kleiner oder gleich dem Absolutwert des Quotienten der beiden Operanden ist. Das Ergebnis ist Null oder positiv, wenn die beiden Operanden das gleiche Vorzeichen haben, und Null oder negativ, wenn die beiden Operanden entgegengesetzte Vorzeichen haben.
Es gibt einen Sonderfall, der diese Regel nicht erfüllt: Wenn der Dividend die negative Ganzzahl mit der größtmöglichen Größe für seinen Typ ist und der Divisor -1
ist, tritt ein Ganzzahlüberlauf auf und das Ergebnis ist gleich dem Dividenden. Trotz des Überlaufs wird in diesem Fall keine Ausnahme ausgelöst. Wenn andererseits der Wert des Divisors in einer ganzzahligen Division 0
ist, wird eine DivisionByZeroException
ausgelöst.
API-Beispielverwendung:
// Outputs int(50)
IntMath:: divide ( 100 , 2 );
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
$ composer test
Weitere Einzelheiten finden Sie in der Testdokumentation.
Beiträge zum Paket sind jederzeit willkommen!
Weitere Informationen finden Sie unter BEITRAG und VERHALTEN.
Wenn Sie sicherheitsrelevante Probleme entdecken, senden Sie bitte eine E-Mail an [email protected], anstatt den Issue-Tracker zu verwenden.
Alle Inhalte dieses Pakets stehen unter der MIT-Lizenz.