尝试使计数器在int范围用尽时返回0。基本上,0, 1, ..., MAX_INT - 1, MAX_INT, 0, 1, ...
惯用语C是
x = ((x + 1) & MAX_INT);
但是这在PHP中不起作用,因为int在溢出时会被提升为double。我能想到的最干净的是x = x == PHP_INT_MAX ? 0 : x + 1
,但它更加混乱。
答案 0 :(得分:1)
这似乎有效:
$x = ($x + 1) % (PHP_INT_MAX+1);
答案 1 :(得分:1)
您可以使用intval()
强制使用整数:
$x = intval($x + 1) & PHP_INT_MAX;
尝试一下:echo intval(PHP_INT_MAX + 1)
:https://3v4l.org/7jlPN
Converting to integer上的手册指出:
如果浮点数超出整数的边界(在32位平台上通常为+/- 2.15e + 9 = 2 ^ 31,在除Windows之外的64位平台上为+/- 9.22e + 18 = 2 ^ 63 ),结果是未定义的,因为float没有足够的精度来给出精确的整数结果。发生这种情况时,不会发出警告,甚至不会发出通知!
所以你是对的,虽然这对于当前的实现是一致的,但是结果被指定为未定义的,你不应该依赖它。
这会给你留下更详细的解决方案,无论是%
模数还是三元条件,你已经拥有它(我更喜欢清晰度和稳健性)。