Podam tutaj moje własne pytanie.
Tak, jest to różnica 32-bitowa/64-bitowa.
W systemach 32-bitowych typ float musi zająć dwa obszary pamięci, aby uzyskać wymagane 64 bity. Php używa podwójnej precyzji (zobacz: http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers)
Wartość $ hex jest równa liczbie zmiennoprzecinkowej. Funkcje Intval i Decbin przekształcają to w typ int (pierwszy przykład powyżej)
W drugim przykładzie używamy operatora bitowego BEFORE, zanim użyjemy decbin. To odwraca najpierw bity w podwójnej precyzji, a następnie jest zamieniane na sekundę.Dając nam coś innego, niż się spodziewaliśmy.
Rzeczywiście, jeśli stawiamy negować wewnątrz intval() tak:
$hex = 0x80008000;
print_r(decbin(intval(~$hex)) . '<br/>');
print_r(decbin(~$hex));
Dostajemy
1111111111111111111111111111111
1111111111111111111111111111111
jako wyjście.
Nie jestem wystarczająco dobry, aby udowodnić to z matematyki (które można znaleźć za pomocą tego artykułu http://en.wikipedia.org/wiki/Double_precision). Ale może, gdy będę miał czas później -_-
Myślę, że bardzo ważne jest, aby dowiedzieć się, w jaki sposób liczby są reprezentowane w komputerach, abyśmy mogli zrozumieć anomalie takie jak to i nie nazywać ich błędami.
Jakiej wersji PHP używasz? Drugi przypadek działa dla mnie na 5.3.6 –
Używam 5.3.8 i problem istnieje. – Pateman
Używam 5.2.17 – Vigrond