PHPは、数値を整数または浮動小数点数として格納します。整数のサイズはプラットフォームによって異なります(ただし、通常は32ビット、符号付き)。より大きな数を表す必要がある場合は、BCMath関数を使用する必要があります。
BCMを使用して2つの数値を加算することは、次のようになります。
$a = '60850985';
$b = '59150141';
echo bcadd($a, $b);
または乗算:
$a = '60850985';
$b = '59150141';
echo bcmul($a, $b);
編集:
取得したい場合は、1の補数で64ビットの符号付き整数としてどのように表示されるか(オーバーフローがある場合)、値を-2^63 .. 2^63-1
範囲内にキャストするために手動変換を行う必要があります。
非負の値の場合、たとえば、最初に次のようにキャストできます0 .. 2^64-1
。
$long = bcmod($value, bcpow('2','64'));
次に、それがそれよりも大きい場合は2^63-1
、それから減算2^63
し、次にこの値をから減算します-2^63
。
2^64
負の値の場合は、値が正になるまで最初にを追加してから、上記の手順を実行します。
ただし、上記の手順は、オーバーフローが発生した場合に文字列番号がどのように表示されるかを確認する場合にのみ必要です。通常、これは必要ありません。おそらく、数値はPHPの署名付き32ビット整数データ型(キャストは不要で、変換は自動的に行われます)に簡単に収まるため、BCMを使用する必要はありません。
$a = '123'; // $a is a string
echo $a + 1; // will write 124, $a gets converted into int
ただし、必要に応じて強制的に変換できます。
$a = $a+0;
また
$a = (int)$a;
編集2:
引き続きBCM関数を使用して計算を行うことができます。
$long = bcadd($low, bcmul($high, bcpow('2','32')))
// this essentially means:
// $long = $low + $high * 2^32
// which is
// $long = $low + $high << 32
次に、結果が2^63-1
あなたができるよりも大きい場合は、上記のいくつかの追加のBCM計算を実行して、符号なし整数を符号付き整数に変換します。