PHP長整型在32位系統中強制轉化溢出


      

        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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM