PHP intval()更改编号NOT 2147483647

时间:2014-11-04 15:20:41

标签: php 32-bit

我正在运行PHP 5.3.13并执行

php -r "echo intval(9999999999);"

输出141006540​​7。

执行时

php -r "echo intval(PHP_INT_MAX);"

输出2147483647。

较小的整数导致我的代码出现问题。为什么不同?

4 个答案:

答案 0 :(得分:5)

9999999999 (base 10) = 10|01010100000010111110001111111111 (base 2)
1410065407 (base 10) =   |01010100000010111110001111111111 (base 2)
                         ^
                         ------------ 32 bits ------------

前两个most significant bits被删除。然后你得到141006540​​7(基数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

表示整数141006540​​7,该函数返回的值。希望这有帮助,快乐编码。

答案 3 :(得分:0)

您的号码很大并导致溢出。 PHP整数是无符号的32位整数。如果您想使用大数字,可以查看BCMath