Tenemos una aritmética de números enteros que por razones históricas tiene que funcionar igual en PHP que en algunos lenguajes estáticos. Desde la última vez que actualizamos PHP, el comportamiento de los enteros desbordados ha cambiado. Básicamente estamos utilizando la fórmula siguiente:Forzar desbordamiento entero de PHP
function f($x1, $x2, $x3, $x4)
{
return (($x1 + $x2)^$x3) + $x4;
}
Sin embargo, incluso con las conversiones:
function f($x1, $x2, $x3, $x4)
{
return intval(intval(intval($x1 + $x2)^$x3) + $x4);
}
Todavía estoy terminando con el número completamente equivocado ...
Por ejemplo, con $ x1 = -1580033017, $ x2 = -2072974554, $ x3 = -1170476976) y $ x4 = -1007518822, termino con -30512150 en PHP y 1617621783 en C#.
Sólo la suma de $ x1 y $ x2 No puedo obtener la respuesta correcta:
En C# consigo
(-1580033017 + -2072974554) = 641959725
En PHP:
intval(intval(-1580033017) + intval(-2072974554)) = -2147483648
que es lo mismo que:
intval(-1580033017 + -2072974554) = -2147483648
No me importa escribir una función "IntegerOverflowAdd" o algo así, pero no puedo entender cómo (-1580033017 + -2072974554) es igual a 641959725. (Reconozco que es -2147483648 + (2 * 2^31)), pero -2147483648 + 2^31 es -1505523923 que es mayor que Int.Min así que ¿por qué se agregan 2 * 2^31 y no 2^31?)
Cualquier ayuda sería apreciada ...
Creo que te refieres PHP_INT_MAX, no PHP_MAX_INT . – scotts