var_dump(PHP_INT_MIN); var_dump(-9223372036854775808); int(9223372036854775807) float(-9.2233720368548E+18)
我们知道64位的整数的表值范围是-9223372036854775808 到 9223372036854775807 在64位系统上PHP内部是使用有符号的64位整形来表示IS_LONG, 分别有俩个常量来表示这俩个值, 分别是PHP_INT_MIN和PHP_INT_MAX. 在PHP编译器处理输入文件输入的时候,对于负数字面量它的处理方式是: 首先把负号后面的数字作为一个整形接受进来,然后在把它求负。 最大正表值是9223372036854775807,那当PHP处理-9223372036854775808的时候, 9223372036854775808 超出了64位整形的最大正表值范围, PHP没有办法用一个有符号64位整形存储它,于是只能把它自动转成了DOUBLE类型。
也就是通过一个表达式来代替直接写一个字面量, 对应的,我们也可以通过在脚本中这么写: $min = -9223372036854775807 - 1; 来避免这个限制,就能正常表达PHP_INT_MIN啦。 其实在PHP7之前并没有定义PHP_INT_MIN的时候,我们也是这么习惯写的,比如PHP源代码中的一些测试脚本中(ext/date/tests/date_create-relative.phpt): if (!defined('PHP_INT_MIN')) { define('PHP_INT_MIN', intval(-PHP_INT_MAX - 1)); }