Quelle est la valeur maximale d'un int en PHP?

117

En ignorant les bibliothèques spéciales qui vous permettent de travailler avec de très grands nombres, quelle est la plus grande valeur int que vous pouvez stocker en PHP?

nickf
la source

Réponses:

124

Depuis le manuel PHP :

La taille d'un entier dépend de la plate-forme, bien qu'une valeur maximale d'environ deux milliards soit la valeur habituelle (soit 32 bits signés). PHP ne prend pas en charge les entiers non signés. La taille entière peut être déterminée en utilisant la constante PHP_INT_SIZE, et la valeur maximale en utilisant la constante PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5.

Les plates-formes 64 bits ont généralement une valeur maximale d'environ 9E18, sauf sur Windows avant PHP 7, où elle était toujours 32 bits.

karim79
la source
15
Eh bien, sur amd64 linux, qui est assez courant de nos jours, son 9223372036854775807 (2 ^ 63-1)
derobert
4
Cela fait beaucoup de chiffres - il y a la première raison à laquelle je peux penser de choisir AMD plutôt qu'Intel lors de l'achat d'un serveur dédié. :)
karim79
39
@ karim79, je pense que c'est dû au fait que l'arc est 64 bits, pas AMD. =]
strager
7
AMD64 est l'un des noms de l'architecture 64 bits utilisée à la fois par AMD et Intel ces jours-ci. D'autres noms pour cela incluent x64 et Intel 64. Comme le dit Strager, rien à voir avec le fait qu'il soit AMD
thomasrutter
4
Mes fenêtres XAMPP font écho à 2147483647. J'ai eu AMD Athlon X2
Vova Popov
86

Constructions 32 bits de PHP:

  • Les nombres entiers peuvent être compris entre -2 147 483 648 et 2 147 483 647 (~ ± 2 milliards)

Constructions 64 bits de PHP:

  • Les nombres entiers peuvent être compris entre -9,223,372,036,854,775,808 et 9,223,372,036,854,775,807 (~ ± 9 quintillions)

Les nombres sont inclusifs.

Remarque: certaines versions 64 bits utilisaient autrefois des entiers 32 bits, en particulier les anciennes versions Windows de PHP

Les valeurs en dehors de ces plages sont représentées par des valeurs à virgule flottante, tout comme les valeurs non entières dans ces plages. L'interpréteur déterminera automatiquement le moment où ce passage à la virgule flottante doit se produire en fonction du fait que la valeur de résultat d'un calcul ne peut pas être représentée sous la forme d'un entier.

PHP ne prend pas en charge les entiers "non signés" en tant que tels, limitant la valeur maximale de tous les entiers à la plage d'un entier "signé".

thomasrutter
la source
1
Fait intéressant, dans les versions 32 bits, les nombres flottants peuvent conserver une précision entière à des valeurs plus élevées que les nombres entiers - les nombres flottants peuvent être utilisés pour des valeurs entières jusqu'à 2 ^ 53 + 1, significativement plus élevées que les 2 ^ 31-1 des entiers. Dans les versions 64 bits, cela est inversé car les flottants ont la même précision, mais les
nombres entiers
21

La taille des ints PHP dépend de la plate - forme :

La taille d'un entier dépend de la plate-forme, bien qu'une valeur maximale d'environ deux milliards soit la valeur habituelle (soit 32 bits signés). PHP ne prend pas en charge les entiers non signés. La taille entière peut être déterminée en utilisant la constante PHP_INT_SIZE, et la valeur maximale en utilisant la constante PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5.

PHP 6 ajoute des "longs" (entiers 64 bits).

cletus
la source
2
Je ne reçois pas ces votes négatifs ... c'est une réponse parfaitement bonne, même avec quelques informations supplémentaires. +1 pour la corriger.
nickf
3
Cette réponse lue à l' origine « plate - forme en charge » (non dépendante). Il affirme aussi (toujours) que les ints 64 bits n'existaient pas avant PHP 6. C'est faux.
thomasrutter
Cependant, PHP 6 n'est jamais arrivé, donc c'est un peu hors de propos.
BadHorsie
16

(un peu tard, mais pourrait être utile)

Ne faites confiance qu'à PHP_INT_MAX et PHP_INT_SIZE , cette valeur varie en fonction de votre arch (32/64 bits) et de votre OS ...

Toute autre «estimation» ou «indice» peut être fausse.

Julien CROUZET
la source
6

Ah je l' ai trouvé: 2 32 - 1 (2147483647)

http://au2.php.net/int

Débordement d'entier

Si PHP rencontre un nombre au-delà des limites du type entier, il sera interprété comme un flottant à la place. De plus, une opération qui aboutit à un nombre au-delà des limites du type entier renverra un flottant à la place.

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

$large_number =  2147483648;
var_dump($large_number);
// output: float(2147483648)
nickf
la source
8
C'est ce que ce serait sur une plate-forme 32 bits. Considérez également que de nombreuses personnes exécutent des serveurs sur une plate-forme 64 bits.
thomasrutter
2

Cela dépend de votre système d'exploitation, mais 2147483647 est la valeur habituelle, selon le manuel .

NullUserException
la source
6
Plus précisément, cela dépend de si vous utilisez une plate-forme 32 bits ou 64 bits. Le 32 bits n'est que "habituel" dans un monde où la plupart des gens utilisent des serveurs 32 bits. Ce n'est de plus en plus le cas.
thomasrutter
0

Bien que les PHP_INT_*constantes existent depuis très longtemps, les mêmes valeurs MIN / MAX peuvent être trouvées par programme en décalant vers la gauche jusqu'à atteindre le nombre négatif:

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

Il est soumis à l'architecture du serveur sur lequel tourne PHP. Pour 64 bits,

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

snr
la source