ホームページ  >  記事  >  バックエンド開発  >  PHP 32 ビット システムにおける長整数強制変換オーバーフローの詳細な紹介

PHP 32 ビット システムにおける長整数強制変換オーバーフローの詳細な紹介

黄舟
黄舟オリジナル
2017-07-17 15:35:162541ブラウズ

CleverCode は最近、PHP プロジェクトのプラスチック変換の問題に遭遇しました。 mysql id = 5147486396 などの、bigint で長整数を含むフィールド ID があります。ただし、php コードは歴史的な理由により複数のマシンにデプロイされており、そのうちマシン A は 32 ビット システム、マシン B は 64 ビット システムです。ここでの問題は、64 ビット システムではページ アクセスが正常に行われることです。 32ビットシステムでのアクセスエラー。原因はPHPシェーピングオーバーフローです。

1 マシンのデモ

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 結論

整数の語長プラットフォームに依存しますが、通常、最大値は約 20 億 (32 ビット符号付き) です。 64 ビット プラットフォームの最大値は通常、9E18 程度です。 PHP は符号なし 整数 をサポートしていません。 整数 値の語長は 定数 PHP_INT_SIZE で表すことができます。PHP 4.4.0 および PHP 5.0.5 以降では、最大値は定数 PHP_INT_MAX

で表すことができます。

以上がPHP 32 ビット システムにおける長整数強制変換オーバーフローの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。