Pourquoi cette affirmation est-elle vraie en PHP?
-
06-07-2019 - |
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?';
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))