целочисленное переполнение — PHP идиома для счетчика неотрицательных целых

При попытке сделать счетчик, который возвращается к 0, когда диапазон int исчерпан. По существу, 0, 1, ..., MAX_INT - 1, MAX_INT, 0, 1, ...

Идиоматический C является

x = ((x + 1) & MAX_INT);

Но это не сработает в PHP, потому что int становится двойным при переполнении. Самое чистое, что я могу придумать, это x = x == PHP_INT_MAX ? 0 : x + 1, но это грязнее.

1

Решение

Это похоже на работу:

$x = ($x + 1) % (PHP_INT_MAX+1);
1

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

Ты можешь использовать intval() заставить использовать целые числа:

$x = intval($x + 1) & PHP_INT_MAX;

Попробуйте это: echo intval(PHP_INT_MAX + 1): https://3v4l.org/7jlPN

Обновить:

Руководство по Преобразование в целое число состояния:

Если число с плавающей запятой выходит за границы целого числа (обычно +/- 2,15e + 9 = 2 ^ 31 на 32-разрядных платформах и +/- 9,22e + 18 = 2 ^ 63 на 64-разрядных платформах, отличных от Windows), результат не определен, так как float не имеет достаточной точности, чтобы дать точный целочисленный результат. Когда это произойдет, предупреждения не будет, даже уведомление не будет!

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

Это оставляет вас с более подробными решениями, либо с % модуль или троичный условный, как у вас уже есть (что я бы предпочел для ясности и надежности).

1

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