Va a dar una oportunidad a mi propia pregunta aquí.
Sí, esto es una diferencia de 32 bits/64 bits.
En los sistemas de 32 bits, un tipo flotante tiene que ocupar dos espacios de memoria para obtener los 64 bits necesarios. Php usa doble precisión (vea http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers)
El $ hex se evalúa como un tipo de letra flotante. Las funciones intval y decbin lo convierten en un tipo int (primer ejemplo anterior)
En el segundo ejemplo estamos utilizando el operador no bit a bit ANTES de usar decbin. Esto invierte primero los bits en el flotador de precisión doble del espacio de dos memorias, y luego se convierte en segundo int.Dándonos algo diferente de lo que esperábamos.
De hecho, si ponemos la negate interior de la intval(), así:
$hex = 0x80008000;
print_r(decbin(intval(~$hex)) . '<br/>');
print_r(decbin(~$hex));
Obtenemos
1111111111111111111111111111111
1111111111111111111111111111111
como salida.
No soy lo suficientemente bueno como para probar esto con las matemáticas todavía (que se puede deducir con la ayuda de este artículo http://en.wikipedia.org/wiki/Double_precision). Pero tal vez cuando tenga tiempo más tarde -_-
Creo que es muy importante aprender cómo se representan los números en las computadoras para que podamos entender anomalías como esta y no llamarlas fallas.
¿Qué versión de PHP estás usando? El segundo caso funciona para mí en 5.3.6 –
Estoy ejecutando 5.3.8 y el problema existe. – Pateman
Estoy usando 5.2.17 – Vigrond