PHP intval()更改编号NOT 2147483647


PHP intval() changes number NOT 2147483647

我正在运行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