標籤:程式 category 結果 常量 出錯 程式猿 sdn max ext
CleverCode近期遇到一個PHP項目整形轉化問題,mysql有一個欄位id是bigint的,裡面有長整型,如id = 5147486396。可是php代碼因為曆史原因卻部署在多台機器中,當中A機器32位系統中,B機器64系統中。如今的問題是64系統中頁面訪問正常。32位系統中訪問出錯了。原因是php整形溢出。
1 A機器示範1.1 擷取A機器系統位元
# getconf LONG_BIT
1.2 整形轉化代碼
<?php$id = 5147486396;echo ‘$id:‘.$id."\r\n";$value = (int)$id;echo ‘(int)$id:‘.$value."\r\n";$value = intval($id);echo ‘intval($id):‘.$value."\r\n";$value = filter_var($id, FILTER_VALIDATE_INT);echo ‘filter_var($id, FILTER_VALIDATE_INT):‘."\r\n";var_dump($value);?>
1.3 執行結果(int)5147486396的結果是852519100。intval(5147486396)的結果是852519100,filter_var(5147486396, FILTER_VALIDATE_INT)結果是false。
2 B機器示範2.1 擷取B機器系統位元# getconf LONG_BIT
2.2 整形轉化代碼
<?php$id = 5147486396;echo ‘$id:‘.$id."\r\n";$value = (int)$id;echo ‘(int)$id:‘.$value."\r\n";$value = intval($id);echo ‘intval($id):‘.$value."\r\n";$value = filter_var($id, FILTER_VALIDATE_INT);echo ‘filter_var($id, FILTER_VALIDATE_INT):‘."\r\n";var_dump($value);?>
2.3 執行結果(int)5147486396的結果是5147486396。intval(5147486396)的結果是5147486396,filter_var(5147486396, FILTER_VALIDATE_INT)結果是5147486396。
3 結論 整型數的字長和平台有關。雖然通常最大值是大約二十億(32 位有符號)。
64 位元平台下的最大值一般是大約 9E18。
PHP 不支援不帶正負號的整數。Integer 值的字長能夠用常量 PHP_INT_SIZE來表示,自 PHP 4.4.0 和 PHP 5.0.5後。最大值能夠用常量 PHP_INT_MAX 來表示。
著作權聲明:1)原創作品,出自"CleverCode的部落格",嚴禁轉載,否則追究著作權法律責任。
2)原創地址:http://blog.csdn.net/clevercode/article/details/46423103。
3)分類地址(PHP程式猿技術精粹):http://blog.csdn.net/clevercode/article/category/3169943(部落格持續添加。關注請收藏)。
4)歡迎大家關注CleverCode部落格很多其它的精彩內容:http://blog.csdn.net/CleverCode。
5)歡迎大家關注CleverCode的微博:http://weibo.com/CleverCode。
PHP長整型在32位系統中強制轉化溢出