5

開発マシンが64ビット(Kubuntu 12.04 64ビットを実行している)であるのに対し、本番サーバーは32ビットであるため、本番環境に移行するとコードで問題が発生します。私の質問はです。23ビットバージョンのPHPをインストールせずにintを強制的に32ビットにすることは可能ですか?それか、最大int値を選択できるライブラリのいずれか

4

3 に答える 3

10

整数は、そのプラットフォーム上のポインターのサイズです。(32ビットPHP->32ビット整数。64ビットPHP->64ビット整数)。

整数演算がオーバーフローすると、変数が浮動小数点になることに注意してください。PHPのドキュメントでは、これらすべてについて詳しく説明しています。

コードで何をしているのかわからないので、整数のサイズを気にする必要があります。ただし、値の32ビットのみを気にする場合は、下位32ビットをいつでもマスクできます。

$val = $something & 0xFFFFFFFF;
于 2013-03-21T20:34:38.190 に答える
3
$r = $r & 0xFFFFFFFF;
if ($r & 0x80000000)
{
    $r = $r & ~0x80000000;
    $r = -2147483648 + $r;
}
于 2019-03-09T15:51:15.637 に答える
0
$r = $r & 0xFFFFFFFF;
if ($r & 0x80000000)
{
    $r = $r & ~0x80000000;
    $r = -2147483648 + $r;
}

誰がそれを要求したかについて説明しようとしています。

$ rの大きな数の変数(たとえば64ビットに分散)を取得し、最も適切な32ビットのみを通過させます。

$r = $r & 0xFFFFFFFF; //aka 0x00000000FFFFFFFF

これで、64ビットの$r変数には32個のゼロと32ビットが含まれます。従来、最も左のビットは、64ビットと32ビットの両方の表現での符号です。プラス(0)またはマイナス(1)であるため、PHPでは64ビットの$rが正と見なされるようになりました。

if ($r & 0x80000000) {

32個のゼロ、32ビット」と「 32個のゼロ、1個および31個のゼロ」のAND演算:これが真の場合、少なくとも(最大で)1個の1があることを意味します。これも、「32ビットの世界ではこの場合、64ビットの$ r変数の左端のほとんどのビットはまだ0であり、PHPはまだ正の数であると見なすため、これが負の数であることもPHPに通知する必要があります。

それで、これが実際には負の数であることをPHPに伝え、その数をリベースします。最初のステップでは、32ビットの左端をゼロに設定して、32ビットの正の値を強制します。

$r = $r & ~0x80000000;

〜0x80000000は、実際には0xFFFFFFFF7FFFFFFFとして書き換えることができます:32個、1個、31個。

これで、64ビット変数内に正の32ビットの数値表現があり、関連する32ビットの負の表現を補完します。たとえば、最初に64の数値(10進数で-1)があった場合、この時点で$ rは32のゼロ、1です。設定したゼロ、31個(10進数で2147483647)。

これで要点がわかります。

$r = -2147483648 + $r;

表現可能な最小の32ビット数+補完的な正の数。

この時点では、$ r変数は64ビット変数のままですが、最初に選択した32個の最も適切なビットの否定性を正しく表すようになりました。

全体的な問題は、64ビットPHPで、右端の32ビットを抽出し、別の64ビット変数を入力した場合、64ビットの左端が0であるため、値は正のままであるということです。代わりに、64ビットを作成します。抽出された32ビットが負の数を表す場合、変数は負です。抽出された32ビットが正の数を表す場合、64ビット変数は正です。

于 2021-08-12T14:48:47.093 に答える