Jaka jest maksymalna wartość int w PHP?

117

Pomijając specjalne biblioteki, które pozwalają na pracę z bardzo dużymi liczbami, jaka jest największa wartość int, jaką możesz przechowywać w PHP?

nickf
źródło

Odpowiedzi:

124

Z podręcznika PHP :

Rozmiar liczby całkowitej jest zależny od platformy, chociaż zwykle przyjmuje się maksymalną wartość około dwóch miliardów (czyli 32 bity ze znakiem). PHP nie obsługuje liczb całkowitych bez znaku. Rozmiar całkowity można określić za pomocą stałej PHP_INT_SIZE, a maksymalną wartość za pomocą stałej PHP_INT_MAX od PHP 4.4.0 i PHP 5.0.5.

Platformy 64-bitowe zwykle mają maksymalną wartość około 9E18, z wyjątkiem systemu Windows przed PHP 7, gdzie zawsze była to wersja 32-bitowa.

karim79
źródło
15
Cóż, w systemie Linux amd64, który jest dość powszechny w dzisiejszych czasach, jego 9223372036854775807 (2 ^ 63-1)
derobert
4
To dużo cyfr - jest to pierwszy powód, dla którego przychodzi mi do głowy wybór AMD zamiast Intela przy zakupie serwera dedykowanego. :)
karim79
39
@ karim79, myślę, że jest to spowodowane tym, że arch jest 64-bitowy, a nie AMD. =]
strager
7
AMD64 to nazwa 64-bitowej architektury używanej obecnie zarówno przez AMD, jak i Intel. Inne nazwy to x64 i Intel 64. Jak mówi
Strager
4
Moje Windows XAMPP echo to 2147483647. Miałem AMD Athlon X2
Vova Popov
86

32-bitowe wersje PHP:

  • Liczby całkowite mogą wynosić od -2 147 483648 do 2 147 483 647 (~ ± 2 miliardy)

64-bitowe wersje PHP:

  • Liczby całkowite mogą wynosić od -9 223 372 036 854 775 808 do 9 223 372 036 854 775 807 (~ ± 9 trylionów)

Liczby są włącznie.

Uwaga: niektóre wersje 64-bitowe kiedyś używały 32-bitowych liczb całkowitych, szczególnie starsze wersje PHP dla systemu Windows

Wartości spoza tych zakresów są reprezentowane przez wartości zmiennoprzecinkowe, podobnie jak wartości niecałkowite w tych zakresach. Interpreter automatycznie określi, kiedy musi nastąpić przełączenie na zmiennoprzecinkowe, w oparciu o to, czy wartość wyniku obliczenia nie może być reprezentowana jako liczba całkowita.

PHP nie obsługuje liczb całkowitych bez znaku jako takich, ograniczając maksymalną wartość wszystkich liczb całkowitych do zakresu liczby całkowitej ze znakiem.

thomasrutter
źródło
1
Co ciekawe, 32-bitowych tworzy pływaków można zachować dokładność całkowita do wartości wyższych niż wskazówki - pływaki mogą być stosowane dla wartości całkowitych do 2 ^ 53 + 1, znacząco wyższy niż 2 ^ 31 - 1 int. W kompilacjach 64-bitowych jest to odwrotne, ponieważ
liczby zmiennoprzecinkowe
21

Rozmiar int PHP zależy od platformy :

Rozmiar liczby całkowitej jest zależny od platformy, chociaż zwykle przyjmuje się maksymalną wartość około dwóch miliardów (czyli 32 bity ze znakiem). PHP nie obsługuje liczb całkowitych bez znaku. Rozmiar całkowity można określić za pomocą stałej PHP_INT_SIZE, a maksymalną wartość za pomocą stałej PHP_INT_MAX od PHP 4.4.0 i PHP 5.0.5.

PHP 6 dodaje „długie” (64-bitowe liczby int).

cletus
źródło
2
nie rozumiem tych negatywnych opinii ... to jest doskonale dobra odpowiedź, nawet z wrzuconymi dodatkowymi informacjami. +1, aby ją poprawić.
nickf
3
Ta odpowiedź pierwotnie czytać „platformy w utrzymaniu” (nie zależnym). Twierdzi również (nadal), że 64-bitowe liczby int nie istniały przed PHP 6. To jest fałsz.
thomasrutter
PHP 6 nigdy się jednak nie wydarzyło, więc jest trochę nieistotne.
BadHorsie
16

(trochę późno, ale może się przydać)

Ufaj tylko PHP_INT_MAX i PHP_INT_SIZE , ta wartość różni się w zależności od Twojego arch (32/64 bity) i systemu operacyjnego ...

Wszelkie inne „domysły” lub „podpowiedzi” mogą być fałszywe.

Julien CROUZET
źródło
6

Ach, znalazłem to: 2 32 - 1 (2147483647)

http://au2.php.net/int

Całkowitą przepełnienie

Jeśli PHP napotka liczbę spoza granic typu całkowitego, zostanie zinterpretowana jako liczba zmiennoprzecinkowa. Ponadto operacja, w wyniku której liczba wykracza poza granice typu całkowitego, zwróci zamiast tego wartość zmiennoprzecinkową.

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

$large_number =  2147483648;
var_dump($large_number);
// output: float(2147483648)
nickf
źródło
8
Tak właśnie wyglądałoby na platformie 32-bitowej. Weź również pod uwagę, że wiele osób korzysta z serwerów na platformie 64-bitowej.
thomasrutter
2

To zależy od twojego systemu operacyjnego, ale 2147483647 jest zwykłą wartością, zgodnie z instrukcją .

NullUserException
źródło
6
W szczególności zależy to od tego, czy korzystasz z platformy 32-bitowej, czy 64-bitowej. 32-bitowy jest tylko „normalny” w świecie, w którym większość ludzi używa 32-bitowych serwerów. Coraz częściej tak się nie dzieje.
thomasrutter
0

Chociaż PHP_INT_*stałe istnieją przez bardzo długi czas, te same wartości MIN / MAX można znaleźć programowo, przesuwając w lewo aż do osiągnięcia liczby ujemnej:

$x = 1;
while ($x > 0 && $x <<= 1);
echo "MIN: ", $x;
echo PHP_EOL;
echo "MAX: ", ~$x;
revo
źródło
0

Podlega architekturze serwera, na którym działa PHP. Wersja 64-bitowa

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

snr
źródło