之前有说过大整数问题。http://www.phpfans.net/blog/2/article/33.html
在工作中又遇到了这个问题。
做相册时,falsh为了区分上传相片,传递一个微妙为单位的时间戳过去给php。参考相册视频的程序,将这个时间戳intval一个。不intval倒没问题,intval问题就来了:
时间戳类似于下面的id
- <?php
- $id = '1259916810671';
- $id2 = '1261993839812';
- var_dump(intval($id));
- var_dump(intval($id2));
- ?>
在 PHP 5.2.0 中输出结果是:(不同版本会有差异)
int(2147483647)
int(2147483647)
都是同一整数,所以后面在上传的相片用这个id去取的时候都是返回第一张。
又是超出了php integer 的范围。
还有就是,相册的相片是保存在100个表中,用通过用户id(之前的相册程序用户id是用整数而不是现在我们用的user_id)求模100得出。由于注册量比较多,用户id也是相当大
以下的程序按道理都应该是 79
- <?php
- $num = 5079;
- $num2 = 10000005079;
- $num3 = 1000000005079;
- var_dump($num%100);
- var_dump($num2%100);
- var_dump($num3%100);
- ?>
在 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字节整数范围的大整数运算, 最好用BC高精度库.