1

2 つの整数があり、それらを long に変換する必要があります。私はこれを行う方法について完全に迷っています。変換する必要がある 2 つの整数は次のとおりです。

INT 1: 60850985 
INT 2: 59150141

2 つの整数を long に変換するメソッドが必要です。投稿できれば、それは素晴らしいことです。

long に変換すると言うと、PHP で java から (long) に相当するものをどのように行うのか疑問に思っています。


ここではっきりさせておきます。クライアントから 2 つの int を受け取っているので、それらを long に変換する必要があります。その後、1 つの long を 1 つの int として再び使用します。

要するに、2 つの int を取り、それらを 1 つの int に変換する必要があります。Java でこれを行う方法の例は次のとおりです。

  long $intA = (long) readInt();
  long $intB = (long) readInt();
  return ($intA << 32) + $intB;
4

2 に答える 2

3

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計算を実行して、符号なし整数を符号付き整数に変換します。

于 2013-01-20T22:43:48.100 に答える
2

私は通常の追加を使用しました:

$int1 = 60850985;
$int2 = 59150141;
$result = $int1 + $int2;//120001126

以下は PHP マニュアルからの引用です。

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

大きな数を処理したい場合は、GMP ( http://www.php.net/manual/en/book.gmp.php ) または BCMath ( http://www.php.net/manual/en/book. bc.php )。

AgentConundrum の発言を詳しく説明すると、PHP では整数を long にキャストする必要はありません。PHP は動的言語です。つまり、一般的に、基本型の操作では、PHP が処理するため、キャストの必要はありません (明示的な目的、つまり float から整数への変換でない限り)。

于 2013-01-20T22:40:04.130 に答える