32 бит — PHP intval () меняет номер НЕ 2147483647

Я использую PHP 5.3.13 и когда я выполняю

php -r "echo intval(9999999999);"

Это выводит 1410065407.

Когда я выполню

php -r "echo intval(PHP_INT_MAX);"

Это выводит 2147483647.

Меньшее целое число вызывает у моего кода некоторые проблемы. Почему разница?

0

Решение

В вашем случае значение 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"
5

Другие решения

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

Первые два наиболее значимые биты удалиться. Тогда вы получите 1410065407 (база 10)

5

Двоичное представление целого числа 9999999999:

0010 0101 0100 0000 1011 1110 0011 1111 1111

Это означает, что вам нужно более 32 бит для представления этого числа. Если вы используете 32-битную архитектуру, это число будет усечено до

0101 0100 0000 1011 1110 0011 1111 1111

которые представляют собой целое число 1410065407, значение, которое возвращает функция. Надеюсь, это поможет, счастливое кодирование.

4

Ваш номер слишком велик и вызывает переполнение. Целые числа PHP — это 32-разрядные целые числа без знака. Если вы хотите работать с большими числами, вы можете взглянуть на BCMath

0
По вопросам рекламы [email protected]