Kraft, PHP integer-überlauf

Wir haben einige integer-Arithmetik, die historische Gründe hat, um die gleiche Arbeit auf PHP-wie in einigen statisch typisierten Sprachen. Seit wir das Letzte mal aktualisiert PHP das Verhalten zum überlaufen ganze zahlen geändert hat. Im Grunde sind wir mit der folgenden Formel:

function f($x1, $x2, $x3, $x4)
{
   return (($x1 + $x2) ^ $x3) + $x4;
}

Jedoch, selbst bei Umbauten:

function f($x1, $x2, $x3, $x4)
{
   return intval(intval(intval($x1 + $x2) ^ $x3) + $x4);
}

Ich bin immer noch am Ende mit der komplett falsche Nummer...

Beispielsweise mit $x1 = -1580033017, $x2 = -2072974554, $x3 = -1170476976) und $x4 = -1007518822, dass ich am Ende mit -30512150 in PHP und 1617621783 in C#.

Nur die addition von $x1 $x2 ich kann nicht die richtige Antwort:

In C# bekomme ich

(-1580033017 + -2072974554) = 641959725

In PHP:

intval(intval(-1580033017) + intval(-2072974554)) = -2147483648

das ist das gleiche wie:

intval(-1580033017 + -2072974554) = -2147483648

Ich bin nicht dagegen, das schreiben eines "IntegerOverflowAdd" - Funktion oder so etwas, aber ich kann nicht ganz herausfinden, wie (-1580033017 + -2072974554) entspricht 641959725. (Ich erkenne, dass es ist -2147483648 + (2 * 2^31), aber -2147483648 + 2^31 ist -1505523923, die größer ist als Int.Min also, warum fügen Sie 2*2^31 und 2^31?)

Jede Hilfe würde geschätzt...

Schreibe einen Kommentar