PHP浮动到int转换不稳定的行为

时间:2014-04-24 20:20:30

标签: php

至少在我的机器上:

$var = PHP_INT_MAX;
var_dump($var);
$var++;
var_dump((int)$var);
$var += 10;
var_dump((int)$var);
$var += 10000;
var_dump((int)$var);

结果:

int(9223372036854775807) 
int(-9223372036854775808) 
int(-9223372036854775808) 
int(-9223372036854765568)

为什么这种行为如此疯狂?我可以理解它每次都会回退PHP_MIN_INT,但是如果你添加某些数字就会改变它?

我在这里运行此代码时得到这些结果:

http://writecodeonline.com/php/

3 个答案:

答案 0 :(得分:2)

它未定义,因为float不适合整数。任何事情都可能发生。这只是PHP,带来了所有的怪癖。使用C中的(long)强制转换操作来实现强制转换操作,在这种情况下未定义,因此您不应该依赖任何特定行为(事实上,在某些平台上,如MIPS64,这将导致CPU异常,这将停止PHP)。

来源:http://www.php.net/manual/en/language.types.integer.php#language.types.integer.casting.from-float

答案 1 :(得分:0)

已更新

关于我无法分辨的最后2行,但是否定结果很可能是由有符号整数表示和算术引起的。阅读更多相关信息here

答案 2 :(得分:0)

$var = PHP_INT_MAX;
var_dump($var);
$var--;
var_dump($var);
$var -= 10;
var_dump((int)$var);
$var -= 10000;
var_dump($var);

如果我们要改变+ - 代码工作正常...这意味着在最大值之后不能加上甚至1,因为没有分配内存大小