Perché questa affermazione è vera in PHP?
-
06-07-2019 - |
Domanda
Non capisco perché questa affermazione in PHP echos 'whaaa?' - (0x0F | 0xF0)
dovrebbe essere 0xFF
no?
if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
Soluzione
Il risultato di questo script:
var_dump((0x0FFFFFFF));
var_dump((0xF0FFFFFF));
var_dump((0x0FFFFFFF | 0xF0FFFFFF));
var_dump((0xFFFFFFFF));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF));
è
int(268435455)
float(4043309055)
int(-1)
float(4294967295)
bool(true)
PHP converte i numeri esadecimali maggiori di 31 bit in float, poiché un intero è firmato e può quindi contenere solo 31 bit positivi.
I numeri esadecimali non sono firmati, quindi la conversione ha senso.
Il primo " o " operazione converte il float in un numero intero, poiché non ha senso eseguire un "quot" o "quot" su un galleggiante. Quindi PHP converte il float in un int per o, il risultato è un int, ma la successiva conversione esadecimale è un float e i valori non sono gli stessi.
Per convertire il float in un numero intero in modo bit a bit, OPPURE con 0x0:
var_dump((0xFFFFFFFF | 0x0));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF | 0x0));
risulta in
int(-1)
bool(false)
-Adam
Altri suggerimenti
Provalo scrivendo var_dump ((0x0FFFFFFF | 0xF0FFFFFF))