PHP_INT_MIN 和 -9223372036854775808

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));
}
踩过这个坑,还有下一个坑等着你,这一路就是给自己填坑,坑填多了,也就习惯了,直到这一路平坦了,也就无怨无悔了。
原文地址:https://www.cnblogs.com/xiaofeilin/p/13963568.html