2014-11-04 60 views
0

我運行PHP 5.3.13,當我執行PHP INTVAL()更改號碼不2147483647

php -r "echo intval(9999999999);" 

它輸出141006540​​7.

當我執行

php -r "echo intval(PHP_INT_MAX);" 

它輸出2147483647.

較小的整數會導致我的代碼出現一些問題。爲什麼區別?

+0

如果在DB中工作,將'int'更改爲'bigint' - 2147483647是mysql中整數的最大值。 – 2014-11-04 15:22:47

+0

您回答了您自己的問題:它不能表示9999999999,因爲它大於PHP_INT_MAX。 – Boann 2014-11-04 15:26:07

+0

http://bytes.com/topic/c/answers/677639-int-changing-its-own-too-large .... – Niloct 2014-11-04 15:26:24

回答

5

在你的情況下,值9999999999被存儲爲float。您可以使用var_dump(9999999999)進行驗證。當它被轉換爲有符號整數時,該值被截斷爲32位,其值爲1410065407

您可以驗證這個計算用手或通過使用GMP數學擴展:

$num = gmp_init("9999999999"); 
$bits = gmp_pow(2, 32); 

var_dump(gmp_strval(gmp_mod($num, $bits))); 
// string(10) "1410065407" 
+0

Ahhhh,這很有道理。我會盡我所能接受。感謝您的明確回答 – 2014-11-04 15:31:33

+1

請解釋您的計算。因爲'(9999999999%2147483647)'對我來說是'1410065411':'9999999999 = 4 * 2147483647 + 1410065411'。但是:'(9999999999&2147483647)= 141006540​​7' – BreyndotEchse 2014-11-04 15:48:33

+0

然後你應該編輯你的答案,因爲在32位系統上'PHP_INT_MAX'實際上是'2147483647'。所以計算是錯誤的(無論如何不可能在32位系統上解決) – BreyndotEchse 2014-11-04 16:37:08

0

你的號碼很大,並導致溢出。 PHP整數是無符號的32位整數。如果你想擁有大量的工作,你可以看看BCMath

4
9999999999 (base 10) = 10|01010100000010111110001111111111 (base 2) 
1410065407 (base 10) = |01010100000010111110001111111111 (base 2) 
         ^
         ------------ 32 bits ------------ 

前兩個most significant bits移除。然後你得到141006540​​7(基數10)

4

的整數9999999999的二進制表示:

0010 0101 0100 0000 1011 1110 0011 1111 1111 

這意味着你需要更多的32位來表示該數字。如果您使用的是32位架構,這一數字將被截斷,以

0101 0100 0000 1011 1110 0011 1111 1111 

代表整數141006540​​7,價值函數返回。希望這有助於快樂的編碼。