Por que esta afirmação é verdadeira em PHP?
-
06-07-2019 - |
Pergunta
Eu não entendo por que essa declaração em PHP ecos 'whaaa? -? (0x0F | 0xF0)
deve ser 0xFF
nenhum
if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
Solução
O resultado deste 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 números hexadecimais maiores que 31 bits em carros alegóricos, como um inteiro é assinado, e pode, portanto, detêm apenas 31 bits positivos.
Os números hexadecimais são não assinado, por isso a conversão faz sentido.
O primeiro "ou" operação converte o flutuador em um inteiro, uma vez que não faz sentido para executar um "ou" em um flutuador. Então PHP converte o float para um int para a ou, o resultado é um int, mas o próximo conversão hexadecimal é um float, e os valores não são os mesmos.
Para converter o float para um inteiro de uma forma bit a bit, ou com 0x0:
var_dump((0xFFFFFFFF | 0x0));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF | 0x0));
resultado em
int(-1)
bool(false)
-Adam
Outras dicas
Test-lo por escrito var_dump((0x0FFFFFFF | 0xF0FFFFFF))