PHP实例教程:php大整数问题

网络整理 - 08-26

  在工作中又遇到了这个问题。

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

  时间戳类似于下面的id

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

  int(2147483647)

  int(2147483647)

  都是同一整数,所以后面在上传的相片用这个id去取的时候都是返回第一张。

  又是超出了php integer 的范围。

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

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

  在 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)) 来克服此问题