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

Don*_*nic 10 php php-7

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

echo PHP_INT_MAX;显示9223372036854775807,但这实际上似乎并不正确.根据PHP 文档,

如果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)
Run Code Online (Sandbox Code Playgroud)

更奇怪的是,文档中的另一个例子:

$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)
Run Code Online (Sandbox Code Playgroud)

这是一个错误,还是我误解了什么?我发现的唯一类似的错误var_dump(PHP_INT_MAX)与xdebug的输出不正确(我的版本中存在),但这似乎无法解释这里发生了什么.如果有人知道我应该包含的相关信息,phpinfo我可以添加它.

Don*_*nic 5

在@Terminus发表了有用的评论后,我尝试xdebug.overload_var_dump=0在php.ini中设置.使用该设置,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
Run Code Online (Sandbox Code Playgroud)

因此,我之前发现的错误报告似乎确实解释了这一点.错误报告中的原始描述说:

var_dump()没有在64位Windows上显示有关PHP_INT_MAX和PHP_INT_MIN常量的正确信息

但似乎这是不完整的; 它实际上显示了大量变量以及常量的不正确信息.