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