2

我不明白为什么 PHP 中的这个语句会回显“whaaa?” ——(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 位的十六进制数转换为浮点数,因为整数是有符号的,因此只能容纳 31 个正位。

十六进制数是无符号的,因此转换是有意义的。

第一个“或”操作将浮点数转换为整数,因为对浮点数执行“或”没有意义。所以PHP将float转换为int为or,结果是int,但是接下来的十六进制转换是float,而且值不一样。

以按位方式将浮点数转换为整数,或将其与 0x0:

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

结果是

int(-1)
bool(false)

-亚当

于 2009-10-27T16:55:08.990 回答