Я использую PHP 5.3.13 и когда я выполняю
php -r "echo intval(9999999999);"
Это выводит 1410065407.
Когда я выполню
php -r "echo intval(PHP_INT_MAX);"
Это выводит 2147483647.
Меньшее целое число вызывает у моего кода некоторые проблемы. Почему разница?
В вашем случае значение 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 (base 10) = 10|01010100000010111110001111111111 (base 2)
1410065407 (base 10) = |01010100000010111110001111111111 (base 2)
^
------------ 32 bits ------------
Первые два наиболее значимые биты удалиться. Тогда вы получите 1410065407 (база 10)
Двоичное представление целого числа 9999999999:
0010 0101 0100 0000 1011 1110 0011 1111 1111
Это означает, что вам нужно более 32 бит для представления этого числа. Если вы используете 32-битную архитектуру, это число будет усечено до
0101 0100 0000 1011 1110 0011 1111 1111
которые представляют собой целое число 1410065407, значение, которое возвращает функция. Надеюсь, это поможет, счастливое кодирование.
Ваш номер слишком велик и вызывает переполнение. Целые числа PHP — это 32-разрядные целые числа без знака. Если вы хотите работать с большими числами, вы можете взглянуть на BCMath