首先,我们知道有两个常量。PHP_INT_MAX
和PHP_INT_SIZE
。
根据PHP官方手册所说,
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9E18。PHP 不支持无符号整数。Integer 值的字长可以用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 来表示。
但是,当我们在Windows下使用64位PHP(版本5.6.4和5.2.17)的时候,PHP_INT_SIZE为4,PHP_INT_MAX为2^31-1。与之相反的是,如果在Linux下使用64位PHP,PHP_INT_SIZE为8,PHP_INT_MAX为2^63-1。PHP Bugs官方也有这么一条BUG报告:https://bugs.php.net/bug.php?id=64863
以下是我的输出
为什么呢?
还是查代码。
我们可以在PHP的main/main.c中查到
在PHP 5.6.4中,代码(https://github.com/php/php-src/blob/PHP-5.6.4/main/main.c#L2233 )为
嗯,那看来和C语言的long长度有关。那应该是编译器的问题了。
我们知道,PHP在Windows下用的VC++编译器。那试试看咯。
先上代码
首先是在x86下编译的结果
再用64位编译器编译吧。
嗯,很好,我们用g++编译器编译呢?
比较一下这两个编译器long的size和max,就能知道为什么在老版本PHP中INT_MAX的值不一样了。
然而,在PHP7中,这里又有了些修改。(https://github.com/php/php-src/blob/master/main/main.c#L2176)
而SIZEOF_ZEND_LONG的定义,在这里(https://github.com/php/php-src/blob/master/Zend/zend_long.h )
所以,PHP7中,应该不会再出现这个问题了。