Question

Je ne comprends pas pourquoi cette déclaration en PHP renvoie "whaaa?" - (0x0F | 0xF0) doit être 0xFF non?

if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
Était-ce utile?

La solution

Le résultat de ce script:

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

est

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

PHP convertit les nombres hexadécimaux de plus de 31 bits en flottants, car un entier est signé et ne peut donc contenir que 31 bits positifs.

Les nombres hexadécimaux ne sont pas signés. La conversion est donc logique.

Le premier "ou" operation convertit le float en entier, car il n’a aucun sens de faire un "&"; sur un char Donc, PHP convertit le float en int pour le ou, le résultat est un int, mais la conversion hexadécimale suivante est un float et les valeurs ne sont pas les mêmes.

Pour convertir le nombre à virgule flottant en un entier de manière binaire, OU avec 0x0:

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

résultats dans

int(-1)
bool(false)

-Adam

Autres conseils

Testez-le en écrivant var_dump ((0x0FFFFFFF | 0xF0FFFFFF))

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top