我正在运行PHP 5.3.13并执行
php -r "echo intval(9999999999);"
输出1410065407。
执行时
php -r "echo intval(PHP_INT_MAX);"
输出2147483647。
较小的整数导致我的代码出现问题。为什么不同?
答案 0 :(得分:5)
9999999999 (base 10) = 10|01010100000010111110001111111111 (base 2)
1410065407 (base 10) = |01010100000010111110001111111111 (base 2)
^
------------ 32 bits ------------
前两个most significant bits被删除。然后你得到1410065407(基数10)
答案 1 :(得分:5)
在您的情况下,值9999999999
将存储为float
。您可以使用var_dump(9999999999)
验证这一点。当它被转换为有符号整数时,该值将被截断为32位,从而得到值1410065407
。
您可以手动或使用GMP数学扩展来验证此计算:
$num = gmp_init("9999999999");
$bits = gmp_pow(2, 32);
var_dump(gmp_strval(gmp_mod($num, $bits)));
// string(10) "1410065407"
答案 2 :(得分:4)
整数9999999999的二进制表示形式为:
0010 0101 0100 0000 1011 1110 0011 1111 1111
这意味着您需要更多32位来表示该数字。如果您使用的是32位架构,那么该号码将被截断为
0101 0100 0000 1011 1110 0011 1111 1111
表示整数1410065407,该函数返回的值。希望这有帮助,快乐编码。
答案 3 :(得分:0)
您的号码很大并导致溢出。 PHP整数是无符号的32位整数。如果您想使用大数字,可以查看BCMath