7

たくさん試して失敗するだけです。

$x = 76561198005785475;

私はこの数にしたい、これに変えてください:

$y = 45519747;

これが32ビット形式です。


詳細を説明しようとしています:

http://www.tonymarston.net/php-mysql/converter.php

1)「Decimal(input)」フィールドに値76561198005785475を入力します。2)「Binary(Base2)」フィールドで「DECtoBIN」を押します。3)右から32を数えてコピーします。4)「Binary(Base2)」フィールドに32文字の2進数を貼り付けます。5)「Binary(Base2)」フィールドの「BintoDec」ボタンを押します。

さて、「45519747」の番号が表示されます。

4

4 に答える 4

17

これを試して:

$y = $x & 0xffffffff;

これにより、64ビット値が32ビット値に切り捨てられますが、64ビット値を元に戻す方法は絶対にないことに注意してください。これは破壊的な方法です。

于 2012-07-27T16:22:13.587 に答える
5

私は多くの解決策を試しました。しかし、誰も私を助けてくれません。最後に、次のスクリプトは私の命を救います。

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}
于 2017-04-04T06:49:51.803 に答える
2

これはコメントに書き込むには長すぎるので、代わりにここに投稿します。

@Kolinkには正しい答えがあります。あなたが欲しいのはその操作です。ただし、とにかくフォーマット$xで保存するには大きすぎるため、32ビットコンピュータで保持され、精度が低下することに注意してください。正しい答えの代わりに45519744を取得する理由についての私のペットの理論は、32ビットコンピューターが最後の桁の精度を失ったというものです。これが実際に動作していることを確認するには、ここでこれを試してください:intfloatfloat

$x = 76561198005785475;
echo (int)$x;

そのサイトは32ビットサーバーを使用しており、45519744を返します。これは精度の低下を示しています。

一方、ここに行って実行すると、次のようになります。

$x = 76561198005785475;
$y = $x & 0xffffff;

そのサイトは64ビットであるため、正しい答えが得られます。

32ビットマシンで操作を実行する場合(明らかに実行するように)、 PHPGMP拡張機能のgmp_andを使用することをお勧めします。残念ながら、それが機能するかどうかをテストすることはできませんでした。それはあなたにお任せします。

于 2012-07-27T17:15:40.607 に答える
0

私は似たようなものを持っていました。Int64からInt32に変換するときにオーバーフローを考慮したかったのです。このコードは私にとってうまく機能しました:

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}
于 2021-04-28T11:38:33.500 に答える