2013-07-10 17 views
7

CASE # 1: Mam następujący kod, który generuje odpowiednią liczbęcałkowita emisja Rodzaj obsady

<?php 
    $integer = 10000000000; 
    $array = array($integer); 
    print_r($array[0]); //output = 1000000000 
?> 

CASE # 2: Ale kiedy jawnie wpisać rzucić tę samą liczbę do liczby całkowitej daje różne wyniki

<?php 
    $integer = (int)10000000000; 
    $array = array($integer); 
    print_r($array[0]); //output = 1410065408 
?> 

CASE # 3: Jeśli Liczbę pomniejszam o jeden 0 i wpisz ją, następnie zwraca poprawną liczbę

<?php 
    $integer = (int)1000000000; 
    $array = array($integer); 
    print_r($array[0]); //output = 1000000000 
?> 

Dlaczego nie produkuje poprawnego wyjścia w CASE # 2?

+0

Wygląda na to, że przekroczył limit dla typu Integer. Maksymalna wartość liczby całkowitej to 2147483647. Przeczytaj ją tutaj: http://php.net/manual/en/language.types.integer.php – SamHuckaby

+0

Tak, przekroczyłeś limit dla typu Integer, więc konwertuje na maksymalną znaną liczbę całkowitą. – MurifoX

+0

Należy zauważyć, że pierwszy przypadek "działa", ponieważ PHP automatycznie konwertuje go na ciąg znaków (lub jakiś typ, który może obsłużyć liczbę). – SamHuckaby

Odpowiedz

4

Najprawdopodobniej przekraczasz maksymalną wartość int na twojej platformie.

Z Official PHP Doc:

rozmiaru całkowita jest zależne od platformy, ale maksymalna wartość około dwóch miliardów jest zwykle wartością (to jest 32 bity ze znakiem). Rozmiar całkowity może być określony za pomocą stałej PHP_INT_SIZE, a maksymalna wartość przy użyciu stałej PHP_INT_MAX od PHP 4.4.0 i PHP 5.0.5.

przypadku peronów 32-bitowe:

Liczby może wynosić od -2147483648 do 2147483647

platform 64-bitowe:

Liczby może wynosić od -9223372036854775808 do 9223372036854775807

+0

Tak, to ma teraz sens. Zamiast tego użyłem 'float' i wyprowadzam poprawną liczbę. Dzięki! –

+0

Nie ma za co, cieszę się, że Twój problem został rozwiązany. – anubhava

1

Przepełniasz maksymalny rozmiar liczby całkowitej w swoim drugi przykład. W twoim pierwszym przykładzie, PHP automagicznie używa większego typu danych liczbowych, takiego jak float, aby utrzymać zmienną, ponieważ jest ona za duża dla int. Kiedy jawnie rzucisz go na przykład w przykładzie 2, ponieważ jest on większy niż maksymalny rozmiar, przycina go do tego maksymalnego rozmiaru. W przykładzie 3 liczba jest wystarczająco krótka, aby zawrzeć ją w int. Jeśli spróbujesz przesłać go do float, uzyska on poprawny wynik.

<?php 
    $integer = (float)10000000000; 
    $array = array($integer); 
    print_r($array[0]); //output = 10000000000 
?> 

The stałej PHP_INT_SIZE powie co maksymalna obsługiwana int wielkości od instalacji PHP.