Pregunta

No entiendo por qué esta afirmación en PHP echos 'whaaa?' - (0x0F | 0xF0) debe ser 0xFF no?

if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
¿Fue útil?

Solución

El resultado de este script:

var_dump((0x0FFFFFFF)); 
var_dump((0xF0FFFFFF)); 
var_dump((0x0FFFFFFF | 0xF0FFFFFF)); 
var_dump((0xFFFFFFFF)); 
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF));

es

int(268435455)
float(4043309055)
int(-1)
float(4294967295)
bool(true)

PHP convierte números hexadecimales mayores de 31 bits en flotantes, ya que un entero está firmado y, por lo tanto, solo puede contener 31 bits positivos.

Los números hexadecimales no tienen signo, por lo que la conversión tiene sentido.

El primer "o" La operación convierte el flotador en un número entero, ya que no tiene sentido realizar un "o"; en un flotador Entonces PHP convierte el flotante en un int para el o, el resultado es un int, pero la siguiente conversión hexadecimal es un flotante, y los valores no son los mismos.

Para convertir el flotante a un entero de manera bit a bit, O con 0x0:

var_dump((0xFFFFFFFF | 0x0)); 
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF | 0x0));

resulta en

int(-1)
bool(false)

-Adam

Otros consejos

Pruébelo escribiendo var_dump ((0x0FFFFFFF | 0xF0FFFFFF))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top