我有一个脚本试图将值增加10000次,但在某些数字后它没有正确增加。
$number = 2147480001;
$number_length = 10;
for ($i = 0; $i < 10000; $i++){
$number++;
$number = sprintf("%0".$number_length."d", $number);
echo $number."\n";
}
结果返回如下:
...... 2147483645 2147483646 2147483647 -2147483648 -2147483647 -2147483646 ......
我能知道它为什么会突然变成负值吗?
答案 0 :(得分:2)
您遇到的现象称为integer overflow。您的整数值存储在具有固定大小(32位)的存储器单元中,因此可以在该单元中存储有限范围的整数值(从PHP_INT_MIN到PHP_INT_MAX)。如果你走向边界,事情就会开始破裂。
根据PHP docs:
如果PHP遇到超出整数类型边界的数字,则会将其解释为float。此外,导致超出整数类型边界的数字的操作将返回浮点数。
如果浮点数超出整数的边界(在32位平台上通常为+/- 2.15e + 9 = 2 ^ 31,在除Windows之外的64位平台上为+/- 9.22e + 18 = 2 ^ 63 ),结果是未定义的,因为浮点数没有足够的精度来给出精确的整数结果。发生这种情况时,不会发出警告,甚至不会发出通知!
对于一次迭代,您的$number
变得大于PHP_INT_MAX常量,因此它将转换为double。之后,您立即将其转换回整数,并获得&#34;未定义的结果&#34;。
答案 1 :(得分:1)
2147483647是有符号整数的最大值。
答案 2 :(得分:0)
这个
for ($i == 0; $i < 10000; $i++){
应该是
for ($i = 0; $i < 10000; $i++)
{
您应该将变量设置为0
,而不是检查它是否等于0
$number_length
的内容是什么?