当$ var非常大时,rand(0,$ var)返回零

时间:2014-03-15 13:31:58

标签: php

当我运行以下代码时:

<?
echo rand(0, 0xfffffffffffffbff); 
echo rand(0, 0xfffffffffffffc00);
echo rand(0, $something_bigger_than_0xfffffffffffffbff);

我有类似的东西:

-828
0
0

(第2和第3个数字将始终为零)

mt_rand()具有相同的行为。

那么,为什么是零?

2 个答案:

答案 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),结果是未定义的,因为浮点数没有   足够的精度来给出精确的整数结果。没有警告,甚至没有   发生这种情况时会发出通知!