我在 Windows 7 上运行 PHP 7.0.8(VC14 x64 线程安全版本)。
echo PHP_INT_MAX;
显示 9223372036854775807
,但这实际上似乎并不正确。根据 PHP documentation ,
If PHP encounters a number beyond the bounds of the integer type, it will be interpreted as a float instead.
但是当我在 32 位系统上运行演示整数溢出的文档中的代码时,情况并非如此。
$large_number = 2147483647;
var_dump($large_number); // expected: int(2147483647) actual: int (2147483647)
$large_number = 2147483648;
var_dump($large_number); // expected: float(2147483648) actual: int (-2147483648)
更奇怪的是,文档中的另一个例子:
$large_number = 9223372036854775807;
var_dump($large_number); // expected: int(9223372036854775807) actual: int(-1)
$large_number = 9223372036854775808;
var_dump($large_number);
// expected: float(9.2233720368548E+18), actual: float(9.2233720368548E+18)
这是一个错误,还是我误解了什么? The only similar bug我发现使用 xdebug(我的版本中存在)处理 var_dump(PHP_INT_MAX)
的错误输出,但这似乎并不能解释这里发生的事情。如果有人知道我应该从 phpinfo
中包含相关信息,我可以添加它。
最佳答案
在@Terminus 的有用评论之后,我尝试在 php.ini 中设置 xdebug.overload_var_dump=0
。使用该设置,var_dump
产生了正确的输出。我突然想到我在测试期间忽略了简单地尝试 echo $large_number;
,所以我重新打开了 overload_var_dump
并且 echo
产生了预期结果,而 var_dump
没有。
$large_number = 2147483648;
echo $large_number; // 2147483648
var_dump($large_number); // int -2147483648
$large_number = 9223372036854775807;
echo $large_number; // 9223372036854775807
var_dump($large_number); // int -1
看来我之前发现的错误报告确实解释了这一点。错误报告中的原始描述说:
var_dump() doesn't show correct info about PHP_INT_MAX and PHP_INT_MIN constants on 64bit Windows
但这似乎是不完整的;它实际上显示了大量变量和常量的错误信息。
关于php - 为什么我的整数在它们应该溢出之前就溢出了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39029282/