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, но это грязнее.

2 ответа

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

$x = ($x + 1) % (PHP_INT_MAX+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 не имеет достаточной точности, чтобы дать точный целочисленный результат. Когда это произойдет, предупреждения не будет, даже уведомление не будет!

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

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

Другие вопросы по тегам