博主


« 2017年-02月 »
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 1 2 3 4

分类


热门标签


最新评论


最近留言


最近访客


概要

  • 文章数量: 41
  • 分类数量: 9
  • 标签数量: 73
  • 评论数量: 159
  • 浏览次数: 2789697

友情链接

再说php大整数问题

作者: 我不是鱼 (2009-12-29 13:37)分类: PHP   标签: php 大整数

之前有说过大整数问题。http://www.phpfans.net/blog/2/article/33.html
在工作中又遇到了这个问题。

做相册时,falsh为了区分上传相片,传递一个微妙为单位的时间戳过去给php。参考相册视频的程序,将这个时间戳intval一个。不intval倒没问题,intval问题就来了:

时间戳类似于下面的id

PHP代码
  1. <?php    
  2. $id = '1259916810671';   
  3. $id2 = '1261993839812';   
  4. var_dump(intval($id));   
  5. var_dump(intval($id2));   
  6. ?>  


在 PHP 5.2.0 中输出结果是:(不同版本会有差异)

int(2147483647)
int(2147483647)

都是同一整数,所以后面在上传的相片用这个id去取的时候都是返回第一张。
又是超出了php integer 的范围。

还有就是,相册的相片是保存在100个表中,用通过用户id(之前的相册程序用户id是用整数而不是现在我们用的user_id)求模100得出。由于注册量比较多,用户id也是相当大

以下的程序按道理都应该是 79

PHP代码
  1. <?php   
  2. $num = 5079;   
  3. $num2 = 10000005079;   
  4. $num3 = 1000000005079;   
  5. var_dump($num%100);   
  6. var_dump($num2%100);   
  7. var_dump($num3%100);   
  8. ?>  


在 PHP 5.2.0 中输出结果是:

int(79)
int(87)
int(-89)

所以对大整数还是要注意。我干脆是取后面两位再intval一下,但如果不是求模100,那就要另行考虑了。

这个问题在手册中有说明了一下,查 dechex 函数,可以看到:

返回一字符串,包含有给定 number 参数的十六进制表示。所能转换的最大数值为十进制的 2147483647,其结果为 "7fffffff"。

新的php版本这个数字已经增大到

转换的最大数值为十进制的 4294967295,其结果为 "ffffffff"。
还有用这些函数时要注意:

crc32
手册上这么说:
由于 PHP 的整数是带符号的,许多 crc32 校验码将返回负整数,因此你需要使用 sprintf() 或 printf() 的“%u”格式符来获取表示无符号 crc32 校验码的字符串。

filesize
因为 PHP 的整数类型是有符号的,并且大多数平台使用 32 位整数,filesize() 函数在碰到大于 2GB 的文件时可能会返回非预期的结果。对于 2GB 到 4GB 之间的文件通常可以使用 sprintf("%u",filesize($file)) 来克服此问题。

评论 (4) | 浏览 (9005)

前一篇: phpMyAdmin查看latin1编码的表中文显示乱码的问题
后一篇: foreach 使用&引用赋值要注意的问题


评论

我只能说,博主, 你是纯粹的PHP程序员.

这个本来不是问题的, 超过4字节整数范围的大整数运算, 最好用BC高精度库.

[游客]WaiTing 2010-03-25 10:51

很正常的,要想在国内网 <a href="http://Lopid.mygamesonline.org">Lopid</a>
[游客]werew 2015-07-23 03:50

Hello!
[游客]<a href="http://Lopid.mygameso 2015-07-23 03:51

1

添加评论

登陆 注册  昵称: