Собираюсь сделать снимок на свой вопрос здесь.
Да, это 32-разрядная/64-разрядная разница.
В 32-разрядных системах тип float должен занимать два пространства памяти, чтобы получить требуемые 64 бита. Php использует двойную точность (см. http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers)
$ hex оценивает тип float. Функции Intval и decbin преобразуют это в тип int (первый пример выше)
Во втором примере мы используем не побитовый оператор, прежде чем будем использовать decbin. Это сначала сбрасывает биты в области памяти с двойной памятью с двойной точностью, а затем преобразуется в int second.Дарить нам нечто иное, чем мы ожидали.
В самом деле, если мы помещаем нивелируют внутри intval() следующим образом:
$hex = 0x80008000;
print_r(decbin(intval(~$hex)) . '<br/>');
print_r(decbin(~$hex));
Мы получаем
1111111111111111111111111111111
1111111111111111111111111111111
выходе.
Я недостаточно хорош, чтобы доказать это с математикой еще (что может быть выяснено с помощью этой статьи http://en.wikipedia.org/wiki/Double_precision). Но может быть, когда у меня будет время позже. -_-
Я думаю, что очень важно узнать, как цифры представлены в компьютерах, чтобы мы могли понять аномалии, подобные этому, и не называть их ошибками.
Какую версию PHP вы используете? Второй случай работает для меня в 5.3.6 –
Я запускаю 5.3.8, и проблема существует. – Pateman
Я использую 5.2.17 – Vigrond