首頁 >後端開發 >php教程 >關於php 32位元系統中長整型的強制轉換溢出的詳細介紹

關於php 32位元系統中長整型的強制轉換溢出的詳細介紹

黄舟
黄舟原創
2017-07-17 15:35:162590瀏覽

        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 &#39;$id:&#39;.$id."\r\n";

$value = (int)$id;
echo &#39;(int)$id:&#39;.$value."\r\n";

$value = intval($id);
echo &#39;intval($id):&#39;.$value."\r\n";

$value = filter_var($id, FILTER_VALIDATE_INT);
echo &#39;filter_var($id, FILTER_VALIDATE_INT):&#39;."\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 &#39;$id:&#39;.$id."\r\n";

$value = (int)$id;
echo &#39;(int)$id:&#39;.$value."\r\n";

$value = intval($id);
echo &#39;intval($id):&#39;.$value."\r\n";

$value = filter_var($id, FILTER_VALIDATE_INT);
echo &#39;filter_var($id, FILTER_VALIDATE_INT):&#39;."\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 來表示
#

以上是關於php 32位元系統中長整型的強制轉換溢出的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn