1165910460 PHP に関する質問です。


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

echo dechex(-3862272609);

マシンAの結果:

19ca659f

マシンBの結果;

80000000


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

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

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


回答の条件
  • 1人2回まで
  • 登録:2006/12/12 17:01:02
  • 終了:2006/12/18 16:19:05

回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912006/12/12 18:16:05

ポイント40pt

dechex の仕様上、

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

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

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

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


base_convert

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

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

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

id:yoski

ありがとうございます。

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

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

2006/12/12 22:11:39
id:kurukuru-neko No.2

kurukuru-neko回答回数1844ベストアンサー獲得回数1552006/12/12 19:16:08

ポイント40pt

整数の範囲

32bitシステム

  • 2147483648 ~ 2147483647

65bitシステム

  • 9223372036854775808 ~ 9223372036854775807

です。

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

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

>にしたいのです。

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

 

id:yoski

ありがとうございます。

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

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

2006/12/12 22:12:22
  • id:kurukuru-neko
    32bitシステム
    -2147483648 ~ 2147483647

    64bitシステム
    -9223372036854775808 ~ 9223372036854775807

    です。

    http://jp2.php.net/manual/ja/function.intval.php

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません