Fenying

Angus’ Home.


19 Oct 2014

PHP 里大整数类型转换问题

该文章迁移自作者的旧博客站点。
源地址:http://fenying.blog.163.com/blog/static/102055993201491911463579/

最近在写 tracker,遇到大整数类型转换溢出问题。具体表现为两个问题。

1. 大整数处理

问题源码如下:

<?php
#.....
foreach (['uploaded', 'downloaded', 'port', 'left'] as $x)
  $this->args[$x] = (int)$_GET[$x];
#.....

乍看之下没问题,一开始测试也没问题。但当 uploadeddownloaded, left 超过 2GB 时,立即崩溃了。原因是 (int) 强制类型转换的实质是 intval 。如下代码:

<?php
echo intval('10000000000').'<br>'; # 2147483647
echo (int)'10000000000'.'<br>'; # 2147483647
echo (0 + '10000000000').'<br>'; # 10000000000 right~

问题解决,下面看第二个问题。

2. 32位有符号整数溢出

问题源码如下:

<?php
echo ip2long('255.255.255.255'); # echo -1

这个,正确的说,其实没错,但是如果我们希望用无符号32位整数表示,那么就郁闷了,尤其是数据库用 INT UNSIGNED 类型储存 IP 的时候。

解决方法很巧妙,源自php doc

<?php
echo sprintf("%u", ip2long('255.255.255.255'));
该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2014/10/19/big-integer-convert-in-php/

comments powered by Disqus