開発マシンが64ビット(Kubuntu 12.04 64ビットを実行している)であるのに対し、本番サーバーは32ビットであるため、本番環境に移行するとコードで問題が発生します。私の質問はです。23ビットバージョンのPHPをインストールせずにintを強制的に32ビットにすることは可能ですか?それか、最大int値を選択できるライブラリのいずれか
3 に答える
整数は、そのプラットフォーム上のポインターのサイズです。(32ビットPHP->32ビット整数。64ビットPHP->64ビット整数)。
整数演算がオーバーフローすると、変数が浮動小数点になることに注意してください。PHPのドキュメントでは、これらすべてについて詳しく説明しています。
コードで何をしているのかわからないので、整数のサイズを気にする必要があります。ただし、値の32ビットのみを気にする場合は、下位32ビットをいつでもマスクできます。
$val = $something & 0xFFFFFFFF;
$r = $r & 0xFFFFFFFF;
if ($r & 0x80000000)
{
$r = $r & ~0x80000000;
$r = -2147483648 + $r;
}
$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ビット変数は正です。