【问题标题】:echo vs echo intval PHP回声与回声间隔 PHP
【发布时间】:2012-12-05 10:03:31
【问题描述】:

请有人解释下面的结果差异

echo intval(1e10); 

输出1410065408

echo 1e10; 

输出10000000000

【问题讨论】:

标签: php


【解决方案1】:

有符号整数有最大值。在 32 位系统上,即 2^16 或 2147483647。当intval-ing 一个更大的数字时,它将溢出。你找到的值也可以计算出来:

php > echo 1e10 % (2147483647);
1410065408

【讨论】:

  • 2^32 是 4294967296!你说的是有符号整数。
  • 请注意,从 PHP/5.5 开始,这也可能影响64-bit PHP on Windows
【解决方案2】:

来自 PHP 手册:

最大值取决于系统。 32 位系统的最大有符号整数范围为 -2147483648 到 2147483647。例如,在这样的系统上,intval('1000000000000') 将返回 2147483647。64 位系统的最大有符号整数值为 9223372036854775807。

intval 将截断数字

【讨论】:

  • 也许吧,但是当我这样做时:intval(intval(1e10)+1),我确实得到了 141006540​​9,所以显然我们不是在谈论最大值。
  • intval() 根据参数的类型以不同的方式处理溢出。当参数超出 int 范围时,intval('10000000000') = 2147483647; intval(1e10) = 1410065408; intval(float) 会产生基本上未定义的结果。看看下面的cmets
【解决方案3】:

代码:

<?php

echo 'intval: ' . intval( 1e10 ) . PHP_EOL;
echo '1e10: ' . 1e10 . PHP_EOL;

从 cli 运行

输出:

intval: 10000000000
1e10: 10000000000

Ubuntu 12.10 x64 php5.4

换句话说,您使用的是 x86(32 位)机器。

【讨论】:

  • 64 位系统可以处理更大的整数。此外,这不是问题的答案。
  • 我什么都没说。