gpt4 book ai didi

php - PHP 中十六进制的否定,有趣的行为

转载 作者:可可西里 更新时间:2023-11-01 12:22:11 25 4
gpt4 key购买 nike

我有一些奇怪的行为,我想知道是否有人可以为我解决问题。

检查一下

$hex = 0x80008000;

print_r(decbin(intval($hex)) . '<br/>');
print_r(decbin($hex));

输出

10000000000000001000000000000000
10000000000000001000000000000000

正如预期的那样。

但是

$hex = 0x80008000;

print_r(decbin(~intval($hex)) . '<br/>');
print_r(decbin(~$hex));

输出

1111111111111110111111111111111
1111111111111111111111111111111

为什么当$hex取反时中间位不切换?

最佳答案

在这里回答我自己的问题。

是的,这是 32 位/64 位的区别。

在32位系统中,一个float类型必须占用两个内存空间才能得到所需的64位。 Php 使用 double (参见 http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers )

$hex 的计算结果为 float 类型。 Intval 和 decbin 函数将其转换为 int 类型(上面的第一个示例)

在第二个示例中,我们在使用 decbin 之前使用了非按位运算符。这会先翻转双内存空间 double float中的位,然后转换为int second。给我们一些不同于我们预期的东西。

确实,如果我们像这样将否定放在 intval() 中:

$hex = 0x80008000;

print_r(decbin(intval(~$hex)) . '<br/>');
print_r(decbin(~$hex));

我们得到

1111111111111111111111111111111
1111111111111111111111111111111

作为输出。

我还不够好,无法用数学证明这一点(这可以在本文 http://en.wikipedia.org/wiki/Double_precision 的帮助下弄清楚)。不过以后有空的时候可能会-_-

我认为了解数字在计算机中的表示方式非常重要,这样我们才能理解这样的异常现象,而不是将它们称为错误。

关于php - PHP 中十六进制的否定,有趣的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9624068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com