当我运行以下代码时:
<?
echo rand(0, 0xfffffffffffffbff);
echo rand(0, 0xfffffffffffffc00);
echo rand(0, $something_bigger_than_0xfffffffffffffbff);
我有类似的东西:
-828
0
0
(第2和第3个数字将始终为零)
mt_rand()具有相同的行为。
那么,为什么是零?
答案 0 :(得分:1)
您需要将整数值传递给rand()
,因为上面的$a = 0xfffffffffffffbff;
是double
但不是整数值,双值0xfffffffffffffbff
将被转换为整数,最终你会得到零。
<?php
$a = 0xfffffffffffffbff;
echo gettype($a); //"prints" double
if(is_int($a))
{
echo "Yes";
}
else
{
echo "Nope.. casting that to int results in..".intval($a)."<br>";
}
echo rand(0, $a);
<强> OUTPUT :
强>
double
Nope.. casting that to int results in..0
0
答案 1 :(得分:1)
rand()
函数将两个整数作为参数。整数通常具有2 ^ 32的最大范围。转换为整数时,提供的参数将大于此值,从而导致整数溢出。
这实际上是记录在案的行为。来自PHP manual documentation:
从float转换为整数时,数字将被舍入 零。
如果浮点数超出整数的边界(通常为+/- 2.15e + 9 在32位平台上= 2 ^ 31,在64位平台上+/- 9.22e + 18 = 2 ^ 63),结果是未定义的,因为浮点数没有 足够的精度来给出精确的整数结果。没有警告,甚至没有 发生这种情况时会发出通知!