我運行PHP 5.3.13,當我執行PHP INTVAL()更改號碼不2147483647
php -r "echo intval(9999999999);"
它輸出1410065407.
當我執行
php -r "echo intval(PHP_INT_MAX);"
它輸出2147483647.
較小的整數會導致我的代碼出現一些問題。爲什麼區別?
我運行PHP 5.3.13,當我執行PHP INTVAL()更改號碼不2147483647
php -r "echo intval(9999999999);"
它輸出1410065407.
當我執行
php -r "echo intval(PHP_INT_MAX);"
它輸出2147483647.
較小的整數會導致我的代碼出現一些問題。爲什麼區別?
在你的情況下,值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"
Ahhhh,這很有道理。我會盡我所能接受。感謝您的明確回答 – 2014-11-04 15:31:33
請解釋您的計算。因爲'(9999999999%2147483647)'對我來說是'1410065411':'9999999999 = 4 * 2147483647 + 1410065411'。但是:'(9999999999&2147483647)= 1410065407' – BreyndotEchse 2014-11-04 15:48:33
然後你應該編輯你的答案,因爲在32位系統上'PHP_INT_MAX'實際上是'2147483647'。所以計算是錯誤的(無論如何不可能在32位系統上解決) – BreyndotEchse 2014-11-04 16:37:08
你的號碼很大,並導致溢出。 PHP整數是無符號的32位整數。如果你想擁有大量的工作,你可以看看BCMath
9999999999 (base 10) = 10|01010100000010111110001111111111 (base 2)
1410065407 (base 10) = |01010100000010111110001111111111 (base 2)
^
------------ 32 bits ------------
前兩個most significant bits移除。然後你得到1410065407(基數10)
的整數9999999999的二進制表示:
0010 0101 0100 0000 1011 1110 0011 1111 1111
這意味着你需要更多的32位來表示該數字。如果您使用的是32位架構,這一數字將被截斷,以
0101 0100 0000 1011 1110 0011 1111 1111
代表整數1410065407,價值函數返回。希望這有助於快樂的編碼。
如果在DB中工作,將'int'更改爲'bigint' - 2147483647是mysql中整數的最大值。 – 2014-11-04 15:22:47
您回答了您自己的問題:它不能表示9999999999,因爲它大於PHP_INT_MAX。 – Boann 2014-11-04 15:26:07
http://bytes.com/topic/c/answers/677639-int-changing-its-own-too-large .... – Niloct 2014-11-04 15:26:24