¿Por qué esta afirmación es verdadera en PHP?
-
06-07-2019 - |
Pregunta
No entiendo por qué esta afirmación en PHP echos 'whaaa?' - (0x0F | 0xF0)
debe ser 0xFF
no?
if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
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))