我正在运行PHP 5.3.13,当我执行时
php -r "echo intval(9999999999);"
它输出1410065407。
当我执行时
php -r "echo intval(PHP_INT_MAX);"
它输出2147483647。
较小的整数导致我的代码出现一些问题。为什么有区别?
9999999999 (base 10) = 10|01010100000010111110001111111111 (base 2)
1410065407 (base 10) = |01010100000010111110001111111111 (base 2)
^
------------ 32 bits ------------
前两个最高有效位被删除。然后你得到1410065407(基本10)
在您的情况下,值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"
整数9999999999的二进制表示为:
0010 0101 0100 0000 1011 1110 0011 1111 1111
这意味着您需要超过32位来表示该数字。如果你使用的是32位体系结构,那么这个数字将被截断为
0101 0100 0000 1011 1110 0011 1111 1111
表示整数1410065407,函数返回的值。
您的数字过大,导致溢出。PHP整数是无符号的32位整数。如果你想处理大数字,你可以看看BCMath