为什么这个陈述在PHP中是正确的?

时间:2009-10-27 16:42:59

标签: php hex bitwise-operators

我不明白为什么这个声明在PHP回声'whaaa?' - (0x0F | 0xF0)应为0xFF否?

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

2 个答案:

答案 0 :(得分:1)

编写var_dump((0x0FFFFFFF | 0xF0FFFFFF))

进行测试

答案 1 :(得分: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个正位。

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

第一个“or”操作将float转换为整数,因为在float上执行“or”没有意义。所以PHP将float转换为int的int,结果是一个int,但是下一个十六进制转换是float,并且值不相同。

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

转换为整数
var_dump((0xFFFFFFFF | 0x0)); 
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF | 0x0));

结果

int(-1)
bool(false)

- 亚当