2

PHP のこのステートメントがなぜ 'whoaaa?' をエコーするのか理解できません。--(0x0F | 0xF0)いいえ0xFF?

if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
4

2 に答える 2

1

書いてテストするvar_dump((0x0FFFFFFF | 0xF0FFFFFF))

于 2009-10-27T16:44:26.500 に答える
1

このスクリプトの結果:

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)

-アダム

于 2009-10-27T16:55:08.990 に答える