Подтвердить что ты не робот

Почему мои целые числа переполняются, прежде чем они должны?

Я запускаю PHP 7.0.8 (версия VC14 x64 Thread Safe) в Windows 7.

echo PHP_INT_MAX; показывает 9223372036854775807, но на самом деле это не кажется правильным. Согласно документации PHP ,

Если PHP встречает число за пределами целочисленного типа, оно будет интерпретироваться как float.

но когда я запускаю код из документации, демонстрирующей целочисленное переполнение в 32-разрядной системе, это не то, что происходит.

$large_number = 2147483647;
var_dump($large_number);     // expected: int(2147483647)     actual: int (2147483647)

$large_number = 2147483648;
var_dump($large_number);     // expected: float(2147483648)   actual: int (-2147483648)

Еще более странно, другой пример из документов:

$large_number = 9223372036854775807;
var_dump($large_number);    // expected: int(9223372036854775807)    actual: int(-1)

$large_number = 9223372036854775808;
var_dump($large_number);    
    // expected: float(9.2233720368548E+18), actual: float(9.2233720368548E+18)

Является ли это ошибкой, или я что-то не понимаю? Единственная аналогичная ошибка, о которой я столкнулся, имеет неправильный вывод var_dump(PHP_INT_MAX) с xdebug (который присутствует в моей версии), но это doesn ' Кажется, это объясняет, что происходит здесь. Если кто-нибудь знает о соответствующей информации, которую я должен включить из phpinfo, я могу добавить ее.

4b9b3361

Ответ 1

После полезного комментария от @Terminus я попытался установить xdebug.overload_var_dump=0 в php.ini. При этой настройке var_dump выдал правильный результат. Мне пришло в голову, что во время тестирования я пренебрег попыткой просто echo $large_number;, поэтому я снова включил overload_var_dump, а echo создал ожидаемый результат, а var_dump не сделал.

$large_number = 2147483648;
echo $large_number;                // 2147483648
var_dump($large_number);           // int -2147483648

$large_number = 9223372036854775807;
echo $large_number;                // 9223372036854775807
var_dump($large_number);           // int -1

Итак, кажется, что отчет об ошибке, который я нашел ранее, действительно объясняет это. В исходном описании в отчете об ошибке говорится:

var_dump() не показывает правильную информацию о константах PHP_INT_MAX и PHP_INT_MIN на 64-битной Windows

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