人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP に関する質問です。

PHP 4.3.9 を使って以下のようなプログラムを実行してみたところ、マシンによって結果が異なるので困っています。

echo dechex(-3862272609);

マシンAの結果:

19ca659f

マシンBの結果;

80000000


どちらも PHP のバージョンは 4.3.9 です。

マシンB の方はすべてのモジュールを含めてコンパイルしているので、そのあたりが原因のような気がしているのですが、何か解決方法などありませんでしょうか。

※マシンB を マシンA のような正しい結果を表示するようにしたいのです。
※base_convert などの代替関数は一部うまく動くのですが・・・




1165910460
●拡大する

●質問者: yoski
●カテゴリ:コンピュータ インターネット
✍キーワード:echo PHP コンパイル バージョン プログラム
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Mook
●40ポイント

dechex の仕様上、

引数 number を 16 進数表現した文字列を返します。 変換できる最大の数字は 4294967295 であり、16 進数で表すと "ffffffff" です。

もともとこの関数は、負の値を想定していないようです。

符号付変数を指定した場合、内部的には符号なし変数と解釈し結果を返しています。つまり、-1でも 4294967295 も結果は同じになります。

−3862272609 は整数型の規定範囲外の数値なので、AとBで結果を同じにすることはできたとしてもそれは、偶然の産物でそれに頼った処理はすべきでは無いでしょう。


base_convert

は内部では浮動小数に変換してから、基底変換をしているようなので、一見大きい数値を扱得るように見えますが、

大きな数値で base_convert() を使用すると、 精度が失われてしまうことがあります。これは、内部で使用している "double" や "float" の性質によるものです。詳細な情報や制限については マニュアルの浮動小数点数 のセクションを参照ください。

という注意点が書かれていますので、その点は注意する必要があるかと思います。

◎質問者からの返答

ありがとうございます。

うーん、この 32bit オーバーフローをエミュレーションしたいのです。

別で質問させていただきます。ありがとうございました!


2 ● kurukuru-neko
●40ポイント

整数の範囲

32bitシステム

65bitシステム

です。

変数の整数がシステムにより違います。

>※マシンB を マシンA のような正しい結果を表示するよう

>にしたいのです。

例は、32bitでは正しく処理できない。

◎質問者からの返答

ありがとうございます。

この不正な 32bit オーバーフローをエミュレーションする方法を探しています。

別で質問させていただきますー

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ