• 技术文章 >后端开发 >php教程

    关于php 32位系统中长整型的强制转化溢出的详细介绍

    黄舟黄舟2017-07-17 15:35:16原创1387
    CleverCode最近遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396。但是php代码由于历史原因却部署在多台机器中,其中A机器32位系统中,B机器64系统中。现在的问题是64系统中页面访问正常。32位系统中访问出错了。原因是php整形溢出。

    1 A机器演示

    1.1 获取A机器系统位数

    # getconf LONG_BIT


    1.2 整形转化代码

    <?php
    
    $id = 5147486396;
    echo '$id:'.$id."\r\n";
    
    $value = (int)$id;
    echo '(int)$id:'.$value."\r\n";
    
    $value = intval($id);
    echo 'intval($id):'.$value."\r\n";
    
    $value = filter_var($id, FILTER_VALIDATE_INT);
    echo 'filter_var($id, FILTER_VALIDATE_INT):'."\r\n";
    var_dump($value);
    
    
    ?>

    1.3 运行结果

    (int)5147486396的结果是852519100,intval(5147486396)的结果是852519100,filter_var(5147486396, FILTER_VALIDATE_INT)结果是false。


    2 B机器演示

    2.1 获取B机器系统位数

    # getconf LONG_BIT


    2.2 整形转化代码

    <?php
    
    $id = 5147486396;
    echo '$id:'.$id."\r\n";
    
    $value = (int)$id;
    echo '(int)$id:'.$value."\r\n";
    
    $value = intval($id);
    echo 'intval($id):'.$value."\r\n";
    
    $value = filter_var($id, FILTER_VALIDATE_INT);
    echo 'filter_var($id, FILTER_VALIDATE_INT):'."\r\n";
    var_dump($value);
    
    
    ?>

    2.3 运行结果

    (int)5147486396的结果是5147486396,intval(5147486396)的结果是5147486396,filter_var(5147486396, FILTER_VALIDATE_INT)结果是5147486396。


    3 结论

    整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9E18。PHP 不支持无符号整数Integer 值的字长可以用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 来表示

    以上就是关于php 32位系统中长整型的强制转化溢出的详细介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 长整型 系统
    上一篇:php如何把远程图片保存到本地文件夹的实例代码详解 下一篇:php内置函数如何在smarty中调用的实例分享
    千万级数据并发解决方案

    相关文章推荐

    • 什么是php-fpm?如何进行优化来提升性能?• 实例详解怎么用PHP实现简易的MVC框架• 消息队列RabbitMQ入门与PHP实例详解• 关于充值合作给对方返回结果格式的有关问题 • webservice有关问题,soap有关问题,响应有关问题-求大神!大神在哪
    1/1

    PHP中文网