Was ist der Maximalwert für ein int in PHP?

117

Was ist der größte int-Wert, den Sie in PHP speichern können, wenn Sie die speziellen Bibliotheken ignorieren, mit denen Sie mit sehr großen Zahlen arbeiten können?

nickf
quelle

Antworten:

124

Aus dem PHP-Handbuch :

Die Größe einer Ganzzahl ist plattformabhängig, obwohl ein Maximalwert von etwa zwei Milliarden der übliche Wert ist (das sind 32 Bit Vorzeichen). PHP unterstützt keine vorzeichenlosen Ganzzahlen. Die Ganzzahlgröße kann mit der Konstanten PHP_INT_SIZE und der Maximalwert mit der Konstanten PHP_INT_MAX seit PHP 4.4.0 und PHP 5.0.5 bestimmt werden.

64-Bit-Plattformen haben normalerweise einen Maximalwert von etwa 9E18, außer unter Windows vor PHP 7, wo es immer 32-Bit war.

karim79
quelle
15
Nun, unter amd64 Linux, das heutzutage weit verbreitet ist, ist es 9223372036854775807 (2 ^ 63-1)
derobert
4
Das sind viele Ziffern - es gibt den ersten Grund, warum ich mir vorstellen kann, AMD gegenüber Intel zu wählen, wenn ich einen dedizierten Server kaufe. :)
karim79
39
@ karim79, ich denke, es liegt daran, dass der Bogen 64-Bit ist, nicht AMD. =]
Strager
7
AMD64 ist ein Name der 64-Bit-Architektur, die heutzutage sowohl von AMD als auch von Intel verwendet wird. Andere Namen dafür sind x64 und Intel 64. Wie Strager sagt, hat das nichts damit zu tun, dass es AMD ist
Thomasrutter
4
Mein Windows XAMPP-Echo ist 2147483647. Ich hatte AMD Athlon X2
Vova Popov
86

32-Bit-Builds von PHP:

  • Ganzzahlen können zwischen -2.147.483.648 und 2.147.483.647 (~ ± 2 Milliarden) liegen.

64-Bit-Builds von PHP:

  • Ganzzahlen können zwischen -9.223.372.036.854.775.808 und 9.223.372.036.854.775.807 (~ ± 9 Billionen) liegen.

Zahlen sind inklusive.

Hinweis: Einige 64-Bit-Builds verwendeten einmal 32-Bit-Ganzzahlen, insbesondere ältere Windows-Builds von PHP

Werte außerhalb dieser Bereiche werden durch Gleitkommawerte dargestellt, ebenso wie nicht ganzzahlige Werte innerhalb dieser Bereiche. Der Interpreter bestimmt automatisch, wann diese Umschaltung auf Gleitkomma erfolgen muss, basierend darauf, ob der Ergebniswert einer Berechnung nicht als Ganzzahl dargestellt werden kann.

PHP unterstützt keine "vorzeichenlosen" Ganzzahlen als solche und begrenzt den Maximalwert aller Ganzzahlen auf den Bereich einer "vorzeichenbehafteten" Ganzzahl.

thomasrutter
quelle
1
Interessanterweise können Floats in 32-Bit-Builds die Ganzzahlgenauigkeit auf höhere Werte als Ints beibehalten - Floats können für Integer-Werte bis zu 2 ^ 53 + 1 verwendet werden, die deutlich höher sind als die 2 ^ 31 - 1 von Ints. In 64-Bit-Builds ist dies umgekehrt, da Floats die gleiche Genauigkeit haben, aber Ints jetzt bis zu 2 ^ 63 - 1 sind.
Thomasrutter
21

Die Größe von PHP-Ints ist plattformabhängig :

Die Größe einer Ganzzahl ist plattformabhängig, obwohl ein Maximalwert von etwa zwei Milliarden der übliche Wert ist (das sind 32 Bit Vorzeichen). PHP unterstützt keine vorzeichenlosen Ganzzahlen. Die Ganzzahlgröße kann mit der Konstanten PHP_INT_SIZE und der Maximalwert mit der Konstanten PHP_INT_MAX seit PHP 4.4.0 und PHP 5.0.5 bestimmt werden.

PHP 6 fügt "Longs" (64-Bit-Ints) hinzu.

Cletus
quelle
2
Ich bekomme diese Abstimmungen nicht. Dies ist eine sehr gute Antwort, auch wenn einige zusätzliche Informationen eingegeben wurden. +1, um sie zu korrigieren.
Nickf
3
Diese Antwort lautete ursprünglich "Plattform in abhängig" (nicht abhängig). Es wird auch (noch) behauptet, dass 64-Bit-Ints vor PHP 6 nicht existierten. Dies ist falsch.
Thomasrutter
PHP 6 ist jedoch nie passiert, daher ist es irgendwie irrelevant.
BadHorsie
16

(etwas spät, könnte aber nützlich sein)

Vertrauen Sie nur PHP_INT_MAX und PHP_INT_SIZE . Dieser Wert variiert je nach Arch (32/64 Bit) und Betriebssystem.

Jede andere "Vermutung" oder "Andeutung" kann falsch sein.

Julien CROUZET
quelle
6

Ah, ich habe es gefunden: 2 32 - 1 (2147483647)

http://au2.php.net/int

Ganzzahliger Überlauf

Wenn PHP auf eine Zahl stößt, die über die Grenzen des Integer-Typs hinausgeht, wird sie stattdessen als Float interpretiert. Außerdem gibt eine Operation, die zu einer Zahl führt, die über die Grenzen des Integer-Typs hinausgeht, stattdessen einen Gleitkommawert zurück.

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

$large_number =  2147483648;
var_dump($large_number);
// output: float(2147483648)
nickf
quelle
8
Dies wäre auf einer 32-Bit-Plattform der Fall. Bedenken Sie auch, dass viele Benutzer Server auf einer 64-Bit-Plattform ausführen.
Thomasrutter
2

Dies hängt von Ihrem Betriebssystem ab, aber 2147483647 ist laut Handbuch der übliche Wert .

NullUserException
quelle
6
Dies hängt insbesondere davon ab, ob Sie auf einer 32-Bit-Plattform oder einer 64-Bit-Plattform ausgeführt werden. 32-Bit ist nur "üblich" in einer Welt, in der die meisten Leute 32-Bit-Server betreiben. Dies wird zunehmend nicht mehr der Fall.
Thomasrutter
0

Obwohl PHP_INT_*Konstanten sehr lange existieren, konnten dieselben MIN / MAX-Werte programmgesteuert durch Linksverschiebung bis zum Erreichen der negativen Zahl ermittelt werden:

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

Es unterliegt der Architektur des Servers, auf dem PHP ausgeführt wird. Für 64-Bit

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

snr
quelle