用于非负数的计数器的PHP习惯用法

时间:2015-12-18 22:11:12

标签: php integer-overflow

尝试使计数器在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,但它更加混乱。

2 个答案:

答案 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没有足够的精度来给出精确的整数结果。发生这种情况时,不会发出警告,甚至不会发出通知!

所以你是对的,虽然这对于当前的实现是一致的,但是结果被指定为未定义的,你不应该依赖它。

这会给你留下更详细的解决方案,无论是%模数还是三元条件,你已经拥有它(我更喜欢清晰度和稳健性)。