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?';
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top