为什么这个说法在 PHP 中是正确的?

发布于 2024-08-08 21:50:52 字数 178 浏览 2 评论 0原文

我不明白为什么 PHP 中的这个语句会回显“whaaa?” -- (0x0F | 0xF0) 应该是 0xFF 不是吗?

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

I don't understand why this statement in PHP echos 'whaaa?' -- (0x0F | 0xF0) should be 0xFF no?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

帅哥哥的热头脑 2024-08-15 21:50:52

该脚本的结果

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进行或,结果是int,但是接下来的十六进制转换是float,并且值不一样。

要将浮点数按位转换为整数,请将其与 0x0 或:

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

结果

int(-1)
bool(false)

The result of this script:

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

is

int(268435455)
float(4043309055)
int(-1)
float(4294967295)
bool(true)

PHP converts hexadecimal numbers larger than 31 bits into floats, as an integer is signed, and can therefore only hold 31 positive bits.

Hexadecimal numbers are unsigned, so the conversion makes sense.

The first "or" operation converts the float into an integer, as it doesn't make sense to perform an "or" on a float. So PHP converts the float to an int for the or, the result is an int, but the next hexadecimal conversion is a float, and the values are not the same.

To convert the float to a integer in a bitwise fashion, OR it with 0x0:

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

results in

int(-1)
bool(false)
终陌 2024-08-15 21:50:52

通过编写 var_dump((0x0FFFFFFF | 0xF0FFFFFF)) 来测试它

Test it by writing var_dump((0x0FFFFFFF | 0xF0FFFFFF))

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文