• 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));
    }
    踩过这个坑,还有下一个坑等着你,这一路就是给自己填坑,坑填多了,也就习惯了,直到这一路平坦了,也就无怨无悔了。
  • 相关阅读:
    Delphi Excel 操作大全
    ThreadLocal类
    MyBatis实战总结
    MyBatis入门
    Mybatis逆向工程
    2020年全国高校计算机能力挑战赛初赛java组
    集合论基础
    命题与逻辑
    Redis技术概述
    UML图中6种箭头的含义
  • 原文地址:https://www.cnblogs.com/xiaofeilin/p/13963568.html
Copyright © 2020-2023  润新知