Php 为什么我的整数在应该溢出之前就溢出了?

Php 为什么我的整数在应该溢出之前就溢出了?,php,php-7,Php,Php 7,我在Windows7上运行PHP7.0.8(VC14 x64线程安全版本) echo PHP\u INT\u MAX显示了9223372036854775807,但这似乎并不正确。根据PHP的说法 如果PHP遇到一个超出整数类型边界的数字,它将被解释为浮点 但当我运行文档中演示32位系统上整数溢出的代码时,实际情况并非如此 $large_number = 2147483647; var_dump($large_number); // expected: int(2147483647)

我在Windows7上运行PHP7.0.8(VC14 x64线程安全版本)

echo PHP\u INT\u 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)
更奇怪的是,文档中的另一个例子:

$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)

这是一个错误,还是我误解了什么?我发现xdebug(在我的版本中)处理了
var\u dump(PHP\u INT\u MAX)
的错误输出,但这似乎不能解释这里发生了什么。如果有人知道我应该从
phpinfo中包含的相关信息,我可以添加它。

在@Terminus提供了一条有用的注释后,我尝试在php.ini中设置
xdebug.overload\u var\u dump=0
。通过该设置,
var\u dump
生成正确的输出。我突然想到,我忽略了简单地尝试
echo$large\u number在我的测试中,所以我打开了
重载var\u dump
,并且
echo
产生了预期的结果,而
var\u 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
所以我之前找到的bug报告似乎确实解释了这一点。bug报告中的原始描述是:

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


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

在这里工作:@Barmar是的,我认为这是我的系统特有的东西,但我不确定如何进行故障排除。据我所知,windows上的PHP只开始支持PHP7中的64位整数,但在这里,我的版本似乎“认为”它支持,而实际上它不支持。它能够在我的windows 7计算机上重现您的结果。我安装了Wamp(wampserver3.0.4_x64_apache2.4.18_mysql5.7.11_php5.6.19-7.0.4),将其切换到php7.0.4,并在脚本中运行代码。没有更改任何配置选项,我得到了您的实际结果。然而,WAMP附带默认安装的xdebug(棒极了!)。我在配置中添加了
xdebug.overload\u var\u dump=0
,得到了预期的输出。如果您没有xdebug,则此评论与此无关。@Terminus感谢您的验证
xdebug.overload\u var\u dump=0
也为我修复了它。我想我被错误报告中的描述弄糊涂了。