целочисленное переполнение — PHP интерпретирует числа как числа с плавающей точкой, даже если они меньше INT_MAX

PHP документация Вот говорится, что:

Если PHP встречает число за пределами целочисленного типа, оно будет интерпретироваться как число с плавающей точкой. Кроме того, операция, результатом которой является число, выходящее за пределы целочисленного типа, вместо этого вернет число с плавающей запятой.

Но как насчет операции, которая приводит к числу меньше, чем PHP_INT_MAX?

Посмотрите этот фрагмент кода в качестве примера:

$max_int = 2**31-1 ; //  2147483647
var_dump(PHP_INT_MAX === $max_int); // false

Как вы можете видеть, даже когда операция приводит к действительному значению int, PHP, кажется, приводит результат к плавающему

var_dump(PHP_INT_MAX === (int) $max_int) // true

Мои вопросы:

Переводит ли PHP-интерпретатор результат в float перед выполнением каких-либо вычислений?

Разве PHP не должен вычислять результат и затем устанавливать тип соответственно? (Имеет смысл правильно?)

Редактировать:

Версия PHP: 7.2.1 32-битная

ОС: Windows: 10 x64

Я использую XAMPP

0

Решение

При расчете $max_int = 2**31-1 двигатель делает это поэтапно:

$tmp = 2**31;
$max_int = $tmp-1

Вот $tmp больше максимального целочисленного значения и преобразуется в число с плавающей точкой. В результате происходит вычитание поплавка, в результате чего получается поплавок. Так как это было плавание, это должно остаться плавать.

3

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

Других решений пока нет …

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