Fare uno scatto alla mia domanda qui.
Sì, questa è una differenza a 32 bit/64 bit.
Nei sistemi a 32 bit, un tipo mobile deve occupare due spazi di memoria per ottenere i 64 bit richiesti. Php usa la doppia precisione (vedere http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers)
$ hex viene valutato in un tipo float. Le funzioni intval e decbin convertono questo in un tipo int (1 ° esempio sopra)
Nel 2 ° esempio si utilizza l'operatore non bit a bit PRIMA di utilizzare decbin. Ciò capovolge prima i bit nello spazio a doppia precisione di due spazi di memoria e quindi viene convertito in secondi int.Dandoci qualcosa di diverso da quello che ci aspettavamo.
Infatti, se mettiamo la negate all'interno del intval() in questo modo:
$hex = 0x80008000;
print_r(decbin(intval(~$hex)) . '<br/>');
print_r(decbin(~$hex));
Otteniamo
1111111111111111111111111111111
1111111111111111111111111111111
come output.
Non sono abbastanza bravo da provarlo con la matematica (che può essere scoperto con l'aiuto di questo articolo http://en.wikipedia.org/wiki/Double_precision). Ma forse quando avrò tempo dopo -_-
Penso che sia molto importante imparare come i numeri sono rappresentati nei computer in modo che possiamo capire anomalie come questa e non chiamarle bug.
Quale versione di PHP stai usando? Il secondo caso funziona per me su 5.3.6 –
Sto eseguendo 5.3.8 e il problema esiste. – Pateman
Sto usando 5.2.17 – Vigrond