いくつかの整数演算は、歴史的な理由から、静的に型付けされたいくつかの言語と同じように PHP でも動作する必要があります。最後に PHP をアップグレードしてから、整数のオーバーフローに対する動作が変更されました。基本的には次の式を使用しています。
function f($x1, $x2, $x3, $x4)
{
return (($x1 + $x2) ^ $x3) + $x4;
}
ただし、変換があっても:
function f($x1, $x2, $x3, $x4)
{
return intval(intval(intval($x1 + $x2) ^ $x3) + $x4);
}
私はまだ完全に間違った番号になってしまいます...
たとえば、$x1 = -1580033017、$x2 = -2072974554、$x3 = -1170476976) および $x4 = -1007518822 では、PHP では -30512150、C# では 1617621783 になります。
$x1 と $x2 を加算するだけでは、正しい答えが得られません。
C#で私は得る
(-1580033017 + -2072974554) = 641959725
PHP の場合:
intval(intval(-1580033017) + intval(-2072974554)) = -2147483648
これは次と同じです:
intval(-1580033017 + -2072974554) = -2147483648
「IntegerOverflowAdd」関数などを書いても構いませんが、(-1580033017 + -2072974554) がどのように 641959725 に等しいかはよくわかりません (-2147483648 + (2 * 2^31) であることは認識しています)。 、しかし -2147483648 + 2^31 は -1505523923 であり、Int.Min よりも大きいので、なぜ 2^31 ではなく 2*2^31 を追加するのですか?)
どんな助けでも大歓迎です...