Qual é o valor máximo para um int em PHP?

117

Ignorando as bibliotecas especiais que permitem que você trabalhe com números muito grandes, qual é o maior valor int que você pode armazenar no PHP?

nickf
fonte

Respostas:

124

Do manual do PHP :

O tamanho de um inteiro depende da plataforma, embora um valor máximo de cerca de dois bilhões seja o valor normal (são 32 bits com sinal). PHP não suporta números inteiros sem sinal. O tamanho do inteiro pode ser determinado usando a constante PHP_INT_SIZE, e o valor máximo usando a constante PHP_INT_MAX desde o PHP 4.4.0 e PHP 5.0.5.

As plataformas de 64 bits geralmente têm um valor máximo de cerca de 9E18, exceto no Windows anterior ao PHP 7, onde era sempre de 32 bits.

karim79
fonte
15
Bem, no Linux amd64, que é bastante comum hoje em dia, é 9223372036854775807 (2 ^ 63-1)
derobert
4
São muitos dígitos - essa é a primeira razão que consigo pensar para escolher a AMD em vez da Intel ao comprar um servidor dedicado. :)
karim79
39
@ karim79, acho que é devido ao arch ser de 64 bits, não por ser AMD. =]
strager de
7
AMD64 é um nome da arquitetura de 64 bits usada tanto pela AMD quanto pela Intel atualmente. Outros nomes incluem x64 e Intel 64. Como diz strager, nada a ver com o fato de ser AMD
thomasrutter
4
Meu windows XAMPP echo's 2147483647. Eu tinha AMD Athlon X2
Vova Popov
86

Compilações de PHP de 32 bits:

  • Os inteiros podem ser de -2.147.483.648 a 2.147.483.647 (~ ± 2 bilhões)

Compilações de PHP de 64 bits:

  • Os inteiros podem ser de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 (~ ± 9 quintilhões)

Os números são inclusivos.

Nota: algumas compilações de 64 bits já usaram inteiros de 32 bits, particularmente compilações do Windows mais antigas de PHP

Valores fora desses intervalos são representados por valores de ponto flutuante, pois são valores não inteiros dentro desses intervalos. O interpretador determinará automaticamente quando essa mudança para o ponto flutuante precisa acontecer com base no fato de o valor do resultado de um cálculo não poder ser representado como um inteiro.

PHP não tem suporte para inteiros "sem sinal" como tal, limitando o valor máximo de todos os inteiros ao intervalo de um inteiro "assinado".

Thomasrutter
fonte
1
Curiosamente, em compilações de 32 bits, os floats podem reter a precisão do inteiro em valores mais altos do que os ints - os floats podem ser usados ​​para valores inteiros de até 2 ^ 53 + 1, significativamente mais altos do que 2 ^ 31-1 de ints. Em compilações de 64 bits, isso é invertido porque os flutuadores têm a mesma precisão, mas os ints agora estão até 2 ^
63-1
21

O tamanho dos ints PHP depende da plataforma :

O tamanho de um inteiro depende da plataforma, embora um valor máximo de cerca de dois bilhões seja o valor normal (são 32 bits com sinal). PHP não suporta números inteiros sem sinal. O tamanho do inteiro pode ser determinado usando a constante PHP_INT_SIZE, e o valor máximo usando a constante PHP_INT_MAX desde o PHP 4.4.0 e PHP 5.0.5.

PHP 6 adiciona "longs" (ints de 64 bits).

cletus
fonte
2
Eu não recebo esses votos negativos ... esta é uma resposta perfeitamente boa, mesmo com algumas informações extras adicionadas. +1 para corrigi-la.
nickf
3
Esta resposta leia originalmente "plataforma em dependentes" (não dependente). Ele também (ainda) afirma que não existiam ints de 64 bits antes do PHP 6. Isso é falso.
thomasrutter
PHP 6 nunca aconteceu, então é um pouco irrelevante.
BadHorsie 01 de
16

(um pouco tarde, mas pode ser útil)

Confie apenas em PHP_INT_MAX e PHP_INT_SIZE , este valor varia no seu arco (32/64 bits) e no seu SO ...

Qualquer outro "palpite" ou "dica" pode ser falso.

Julien CROUZET
fonte
6

Ah eu encontrei: 2 32 - 1 (2147483647)

http://au2.php.net/int

Estouro de inteiro

Se o PHP encontrar um número além dos limites do tipo inteiro, ele será interpretado como um float. Além disso, uma operação que resulta em um número além dos limites do tipo inteiro retornará um float.

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

$large_number =  2147483648;
var_dump($large_number);
// output: float(2147483648)
nickf
fonte
8
Isso é o que seria em uma plataforma de 32 bits. Considere também que muitas pessoas executam servidores em uma plataforma de 64 bits.
thomasrutter
2

Depende do seu SO, mas 2147483647 é o valor normal, de acordo com o manual .

NullUserException
fonte
6
Especificamente, depende se você está executando em uma plataforma de 32 bits ou 64 bits. 32 bits é apenas "normal" em um mundo onde a maioria das pessoas executa servidores de 32 bits. Cada vez mais, esse não é o caso.
thomasrutter
0

Embora as PHP_INT_*constantes existam por um longo tempo, os mesmos valores MIN / MAX podem ser encontrados programaticamente deslocando para a esquerda até atingir o número negativo:

$x = 1;
while ($x > 0 && $x <<= 1);
echo "MIN: ", $x;
echo PHP_EOL;
echo "MAX: ", ~$x;
revo
fonte
0

Está sujeito à arquitetura do servidor no qual o PHP é executado. Para 64 bits,

print PHP_INT_MIN . ", ” . PHP_INT_MAX; rendimentos -9223372036854775808, 9223372036854775807

snr
fonte