Поэтому я решил проблему и много узнал о PHP (по крайней мере, так, как он справляется с переполнением Integer).
1) Это полностью зависело от того, на какой платформе работает машина, в какой версии PHP, независимо от того, был ли запущен Suhosin Hardened PHP, и сколько битов было скомпилировано для (32 или 64). 6 велись так, как я ожидал (что было фактически неправильно, по крайней мере, неправильно в соответствии с их документацией), и 3 машины вели себя так, как я все еще не могу объяснить, и 3 машины вели себя в соответствии с тем, что говорит команда intval в документация.
2) Предполагается, что Intval вернет PHP_MAX_INT, когда int> PHP_MAX_INT (не int & 0xffffffff), но это происходит только в некоторых версиях PHP4 и PHP5. Различные версии PHP возвращают разные значения при int> PHP_MAX_INT.
3) Следующий код может возвращать 3 разных результата (см. 1):
<?php
echo "Php max int: ".PHP_INT_MAX."
";
echo "The Val: ".(-1580033017 + -2072974554)."
";
echo "Intval of the val: ".intval(-3653007571)."
";
echo "And 0xffffffff of the val: ".(-3653007571 & 0xffffffff)."
";
?>
Он может вернуться (что кажется правильным для Intval, но неверно для & 0xffffff)
Php max int: 2147483647
The Val: -3653007571
Intval of the val: -2147483648
And of the val: -2147483648
И он может вернуться (что противоречит документации PHP для intval):
Php max int: 2147483647
The Val: -3653007571
Intval of the val: -641959725
And of the val: -641959725
И на 64-битных машинах возвращается (что правильно):
Php max int: 2147483647
The Val: -3653007571
Intval of the val: -3653007571
And of the val: -641959725
Решение
Во всяком случае, мне нужно решение, которое будет работать на всех этих платформах, и не будет зависеть от особенностей конкретной версии PHP, скомпилированной с конкретным Max int. Таким образом, я использую следующую кросс-PHP функцию тридцать TwwBitIntval:
function thirtyTwoBitIntval($value)
{
if ($value < -2147483648)
{
return -(-($value) & 0xffffffff);
}
elseif ($value > 2147483647)
{
return ($value & 0xffffffff);
}
return $value;
}
Комментарий
Я считаю, что разработчики PHP должны сказать, что Int - это 32-битный Int, независимо от того, работает ли он на 32-разрядной или 64-битной машине (например, в среде DOTNet CLR) и не случайно повышал ее до float в зависимости от количества битов, которые PHP является компилятором.