1. 程式人生 > >PHP長整型在32位系統中強制轉化溢位

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 來表示。