Nous avons un certain nombre d'arithmétiques entiers qui, pour des raisons historiques, doivent fonctionner de la même manière sur PHP que dans quelques langages statiquement typés. Depuis la dernière mise à jour de PHP, le comportement des entiers débordant a changé. En fait, nous utilisons la formule suivante:Forcer le débordement d'entier PHP
function f($x1, $x2, $x3, $x4)
{
return (($x1 + $x2)^$x3) + $x4;
}
Cependant, même avec des conversions:
function f($x1, $x2, $x3, $x4)
{
return intval(intval(intval($x1 + $x2)^$x3) + $x4);
}
Je termine encore avec le nombre complètement faux ...
Par exemple, avec $ x1 = -1580033017, $ x2 = -2072974554, $ x3 = -1170476976) et $ x4 = -1007518822, je me retrouve avec -30512150 en PHP et 1617621783 en C#.
Juste additionnant $ x1 et x2 $ Je ne peux pas obtenir la bonne réponse:
En C# Je reçois
(-1580033017 + -2072974554) = 641959725
En PHP:
intval(intval(-1580033017) + intval(-2072974554)) = -2147483648
qui est le même que:
intval(-1580033017 + -2072974554) = -2147483648
Cela ne me dérange pas d'écrire une fonction "IntegerOverflowAdd" ou quelque chose, mais je n'arrive pas à comprendre comment (-1580033017 + -2072974554) est égal à 641959725. (Je reconnais que c'est -2147483648 + (2 * 2^31), mais -2147483648 + 2^31 est -1505523923 qui est supérieur à Int.Min alors pourquoi est-ce que vous ajoutez 2 * 2^31 et non 2^31?)
Toute aide serait appréciée ...
Je pense que vous voulez dire PHP_INT_MAX, pas PHP_MAX_INT . – scotts