PHP中int的最大值是多少?

143

除了允许您使用非常大的数字进行操作的特殊库之外,在PHP中可以存储的最大整数值是多少?

8个回答

152

根据PHP手册

整数的大小依赖于平台,通常最大值是约20亿(32位有符号整数)。PHP不支持无符号整数。可以使用常量PHP_INT_SIZE确定整数的大小,并使用常量PHP_INT_MAX确定最大值,自PHP 4.4.0和PHP 5.0.5以来。

64位平台通常具有约9E18的最大值,但在PHP 7之前的Windows平台上,它始终为32位。


15
在如今相当普遍的amd64 Linux系统上,其最大值为9223372036854775807(2的63次方减1)。 - derobert
4
这真是很多数字——这是我能想到的第一个理由,为什么购买专用服务器时要选择AMD而不是英特尔。 :) - karim79
41
@karim79,我认为这是因为架构是64位而不是AMD造成的。=] - strager
9
AMD64是目前由AMD和Intel所使用的64位架构的一种名称。其他称呼包括x64和Intel 64。正如Strager所说,这与它是否由AMD制造无关。 - thomasrutter
4
我的 Windows XAMPP 回显了 2147483647。我使用的是 AMD Athlon X2 处理器。 - Vova Popov
显示剩余6条评论

105

32位版 PHP:

  • 整数的范围是从-2,147,483,6482,147,483,647(约 ± 20 亿)

64位版 PHP:

  • 整数的范围为-9,223,372,036,854,775,8089,223,372,036,854,775,807 (约 ± 9 万亿亿)

数字包括在范围内。

注意:有些64位版本曾使用32位整数,特别是较早的 Windows 版本 PHP。

超出这些范围的值会用浮点数表示,这个范围内的非整数值也将如此。解释器将根据计算结果是否可以表示为整数自动确定何时需要切换到浮点数。

PHP 不支持“无符号”整数,因此所有整数的最大值都限制在“有符号”整数的范围内。


1
有趣的是,在32位版本中,浮点数可以保留比整数更高的精度,可用于整数值达到2^53 + 1,远高于整数的2^31 - 1。在64位版本中,这种情况正好相反,因为浮点数具有相同的精度,但是整数现在可以达到2^63 - 1。 - thomasrutter
PHP没有对“unsigned”整数提供支持,这意味着在PHP中无法使用“int”表示无符号长整型的最大值,无论是32位还是64位。此外,由于JavaScript将浮点数和整数组合成单个“number”类型,因此JavaScript“number”可以表示最大53位的整数值。因此,在设计模式时,考虑到大多数系统上可以表示的最大整数值为带符号的53位而不是(带符号或无符号的)64位是有意义的。 - Stijn de Witt
我认为在这里JavaScript很相关,因为“number”限制会影响JSON,而JSON也无法表示大于53位的整数值。 - Stijn de Witt
那53位的重要性来自IEEE754,这也是浮点数标准,直接集成在处理器中。 - thomasrutter
是的,许多编程语言定义了特定的整数类型,这些类型不会被内部存储为双精度浮点数。这使得这些语言具有64位整数。例如,Java有long,它是一个带符号的64位整数。C有unsigned long long,在64位架构上可以给你一个无符号的64位整数。这意味着在Java和C中,您可以创建比JavaScript中的number表达更高的整数值。例如,在创建JSON API时,这很重要。 - Stijn de Witt

24

PHP中整数的大小是平台相关的:

整数的大小取决于平台,尽管通常的最大值为约20亿(即32位有符号整数)。PHP不支持无符号整数。整数大小可以使用常量PHP_INT_SIZE确定,最大值可以使用常量PHP_INT_MAX自PHP 4.4.0和PHP 5.0.5起使用。

PHP 6添加了“longs”(64位整数)。


2
我不理解为什么会有人给这个回答踩票..这是一个完全正确的答案,甚至还加入了一些额外的信息。点赞来纠正它。 - nickf
3
这个答案最初写成了"不依赖于平台"(platform independent),而非"依赖于平台"(platform dependent)。它还声称在 PHP 6 之前不存在 64 位整数,这是错误的。请注意,此内容仅供翻译,不包括任何解释或其他信息。 - thomasrutter
1
PHP6从未发生过,所以这有点无关紧要。 - BadHorsie
无论 PHP 6 是否发布,这个答案声称早期版本的 PHP 没有 64 位整数,甚至暗示自那时起 PHP 版本有了一个名为“long”的数据类型 - 这两者都是不正确的。 - thomasrutter

18

(有点晚了,但可能有用)

只信任PHP_INT_MAX和PHP_INT_SIZE,这个值会因为你的架构(32位/64位)和操作系统而不同...

其他任何“猜测”或“提示”都可能是错误的。


7

啊,我找到了:232 - 1 (2147483647)

http://au2.php.net/int

整数溢出

如果PHP遇到超出整数类型范围的数字,它将被解释为浮点数。此外,导致结果超出整数类型范围的操作将返回一个浮点数。

<?php
$large_number =  2147483647;
var_dump($large_number);
// output: int(2147483647)

$large_number =  2147483648;
var_dump($large_number);
// output: float(2147483648)

8
这是在32位平台上的情况。还要考虑到许多人在64位平台上运行服务器。 - thomasrutter

2

这取决于 PHP 运行的服务器架构。对于 64 位,

print PHP_INT_MIN . ", ” . PHP_INT_MAX; 的输出结果是 -9223372036854775808, 9223372036854775807

(注:原文中的 "Original Answer" 翻译成中文有些奇怪,这里已经省略了)


2

根据手册,这取决于您的操作系统,但2147483647是通常的值。


6
具体而言,这取决于您是在32位平台还是64位平台上运行。在大多数人运行32位服务器的世界中,32位仅仅是“常规”的选择。然而,随着时间的推移,这种情况越来越不再普遍。 - thomasrutter

1
虽然 PHP_INT_* 常量已经存在很长时间,但是通过左移直到达到负数可以编程地找到相同的 MIN / MAX 值:
$x = 1;
while ($x > 0 && $x <<= 1);
echo "MIN: ", $x;
echo PHP_EOL;
echo "MAX: ", ~$x;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接