PHP:大きな整数を文字列からintにオーバーフローで変換する

PHP does not support unsigned ints. Is there a way to convert a string representation of an unsigned integer into a signed integer with overflow?

Example:
On a 32 bit system, PHP can store int values <= 2147483647. I want a way to convert the string "2147483648" to integer, causing it to overflow to -2147483648 instead of being reduced to 2147483647.

Why do I want to do this?
I store IPv4 addresses in a database as unsigned int (32 bits). I want to do binary operations on the addresses in PHP to check for subnets. This needs to be done on every request, so it needs to be quick. Therefore it seems better to store the IP address as an unsigned int rather than storing a string which will have to be converted back and forth.

0
最速のソリューション:64Bitを使用
追加された 著者 KingCrunch,
はい、私はいつもアプリケーションが配備されている環境を管理していると仮定します。これがいつも正しいかどうかはわかりません。
追加された 著者 MW.,

3 答え

ここに回避策があります。

<?php
    $unsignedString = "3000000000";
    echo "unsigned string: ".$unsignedString."
"; $signedInt = intval(doubleval($unsignedString)); echo "signed int: ".$signedInt."
"; ?>
4
追加された
はい、完璧です!どうもありがとう!
追加された 著者 MW.,

これを行う最も簡単で簡単な方法は、RDBMSに何とかしてもらうことです。

定義済み定数 PHP_INT_SIZE の値をチェックすることで、PHPの整数のサイズを知ることができます。 32ビットシステムで実行している場合は4、64ビットシステムで実行している場合は8になります。

変数を変数に代入することをお勧めします

$smallIntegers = intval(PHP_INT_SIZE == 4);

あなたのクエリで次のようなものを使用してください:

SELECT
    ...,
    CASE
        WHEN :smallIntegers: = 1 AND IPAddress > 2147483647 THEN IPAddress - 4294967296
        ELSE IPAddress
    END AS IPAddress,
    ...
...
0
追加された
あなたが言うように、これはもっと速いでしょうが、私は私のアーキテクチャを保つためにPHPでやりたいと思います。
追加された 著者 MW.,

IPアドレスを整数配列に格納することができます。IPの1つのセグメントを配列の各部分に格納することができます。したがって、最大値は255のいずれかの整数に格納されます。

$ipAddress = array(127, 0, 0, 1);
0
追加された
私は恐れていない - これは、アドレス上でビット単位の操作を使用できるという目的を捨てるだろう。
追加された 著者 MW.,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com