为什么我的整数应该溢出呢?

时间:2016-08-19 00:06:35

标签: php php-7

我在Windows 7上运行PHP 7.0.8(VC14 x64线程安全版)。

echo PHP_INT_MAX;显示9223372036854775807,但这似乎并不正确。根据PHP documentation

  

如果PHP遇到超出整数类型边界的数字,它将被解释为浮点数。

但是当我从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的相关信息,我可以添加它。

1 个答案:

答案 0 :(得分:5)

在@Terminus的有用评论之后,我尝试在php.ini中设置xdebug.overload_var_dump=0。使用该设置,var_dump生成了正确的输出。我突然想到在测试过程中忽略了echo $large_number;,所以我重新开启了overload_var_dumpecho产生了预期的结果,var_dump没有。{ / p>

$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()在64位Windows上没有显示有关PHP_INT_MAX和PHP_INT_MIN常量的正确信息

但似乎这是不完整的;它实际上显示了大量变量和常量的错误信息。