Domanda

Non capisco perché questa affermazione in PHP echos 'whaaa?' - (0x0F | 0xF0) dovrebbe essere 0xFF no?

if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
È stato utile?

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))

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top