PHP のこのステートメントがなぜ 'whoaaa?' をエコーするのか理解できません。--(0x0F | 0xF0)
いいえ0xFF
?
if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
PHP のこのステートメントがなぜ 'whoaaa?' をエコーするのか理解できません。--(0x0F | 0xF0)
いいえ0xFF
?
if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
書いてテストするvar_dump((0x0FFFFFFF | 0xF0FFFFFF))
このスクリプトの結果:
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 は 31 ビットを超える 16 進数を浮動小数点数に変換します。これは、整数が符号付きであるため、正の 31 ビットしか保持できないためです。
16 進数は符号なしであるため、変換は理にかなっています。
最初の「or」演算は、float に対して「or」を実行しても意味がないため、float を整数に変換します。そのため、PHP は float を or の int に変換します。結果は int ですが、次の 16 進数変換は float であり、値は同じではありません。
float をビット単位で整数に変換するには、0x0 で OR します。
var_dump((0xFFFFFFFF | 0x0));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF | 0x0));
結果は
int(-1)
bool(false)
-アダム