• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オーバーフロー)

Perlで16進数の変換をしていたらオーバーフローが発生する警告文が表示される

このQ&Aのポイント
  • perlで16進数の変換をしていたらオーバーフローが発生する警告文が表示されます。
  • 実際に数値を確認すると特に変換に間違いは無いように思えます。
  • 実行環境はWINDOWS XP+ActivePerl-5.8.8.817です。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

警告に Hexadecimal number > 0xffffffff non-portable at overflow.pl line 10. というのも出てませんでしたか? #ファイル名と行数は無視してください。 ActivePerlでは整数の幅は32bitでありこれの最大値は 十六進表記で 0xffffffff ですので、その値からはあふれています。 ただし、Perlでは数値を表すのに整数であっても浮動小数点データとして扱うので #そうしないように指定はできますが そこではオーバーフローしないので 結果が正しく出ているように見えているのです。

japonegold
質問者

お礼

ご回答ありがとうございます。 Hexadecimal number > 0xffffffff non-portable at overflow.pl line 10.は出ていませんでしたが、 なぜこういう現象が起きるのか勉強になりました。 警告文を表示させるので、処理速度に多少影響はありそうですが、 実際に変換した値で演算するわけではないので、現状は無視していても問題はなさそうです。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

説明を読み返していたらよくわからないところがあったので補足。 1. Perl では数値は基本的にCでいうところのdoubleという型 で表します。 2. しかしたとえばビット操作が絡むときなどにCのintが顔を出すことがあります。 例: print ~0 → 4294967295 (0xffffffff) hex 関数は十六進表記の文字列を変換しますが double型のデータをそのような十六進表記することはないので、 hex 関数内部でチェックをしているのだと思われます。 なお、わたしの#1の回答にある Hexadecimal number > 0xffffffff non-portable という警告は、 use warnings; というプラグマ指定をしたときに出ます。 また、 no warnings; というプラグマ指定をすると、 Integer overflow in hexadecimal number こっちもでなくなります。 が、スクリプトをいじっている途中ではこの プラグマは指定しないほうが良いと思います。 バグ発見の手掛かりにもなりますので。

すると、全ての回答が全文表示されます。

関連するQ&A