PHP 4.3.9 を使って以下のようなプログラムを実行してみたところ、マシンによって結果が異なるので困っています。
echo dechex(-3862272609);
マシンAの結果:
19ca659f
マシンBの結果;
80000000
どちらも PHP のバージョンは 4.3.9 です。
マシンB の方はすべてのモジュールを含めてコンパイルしているので、そのあたりが原因のような気がしているのですが、何か解決方法などありませんでしょうか。
※マシンB を マシンA のような正しい結果を表示するようにしたいのです。
※base_convert などの代替関数は一部うまく動くのですが・・・
dechex の仕様上、
引数 number を 16 進数表現した文字列を返します。 変換できる最大の数字は 4294967295 であり、16 進数で表すと "ffffffff" です。
もともとこの関数は、負の値を想定していないようです。
符号付変数を指定した場合、内部的には符号なし変数と解釈し結果を返しています。つまり、-1でも 4294967295 も結果は同じになります。
−3862272609 は整数型の規定範囲外の数値なので、AとBで結果を同じにすることはできたとしてもそれは、偶然の産物でそれに頼った処理はすべきでは無いでしょう。
は内部では浮動小数に変換してから、基底変換をしているようなので、一見大きい数値を扱得るように見えますが、
大きな数値で base_convert() を使用すると、 精度が失われてしまうことがあります。これは、内部で使用している "double" や "float" の性質によるものです。詳細な情報や制限については マニュアルの浮動小数点数 のセクションを参照ください。
という注意点が書かれていますので、その点は注意する必要があるかと思います。
整数の範囲
32bitシステム
65bitシステム
です。
変数の整数がシステムにより違います。
>※マシンB を マシンA のような正しい結果を表示するよう
>にしたいのです。
例は、32bitでは正しく処理できない。
ありがとうございます。
この不正な 32bit オーバーフローをエミュレーションする方法を探しています。
別で質問させていただきますー
ありがとうございます。
うーん、この 32bit オーバーフローをエミュレーションしたいのです。
別で質問させていただきます。ありがとうございました!