コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
しんいち ◆lHy.hAWXbthn
2018/6/7 23:56
情報交換
GSAVEに実数型配列指定するとヤバい?
今更なのかも知れませんが、GSAVEに実数型配列を指定すると、32bit整数を超えた値が格納されることがあるみたいですね(今までずっとそうだったんだろうか?全然気が付かなかった^^;)。

何でオーバーフローになるのか分からなくて、しばらく悩まされましたよ。。。

コメント

アバター
ツララ 2018/6/9 19:36 ◆ArUdBYOYME1V
4294505744って二進数表記に直すと
11111111111110001111100011111000ですから
別にbit長は32bitを超えた数値にはなってないんじゃないんです?
あっても越えた分は無視されるとか?
オーバーフローって具体的にどういう処理をした時に発生するんです?
チョロっと発生した時のコード書いてみそ?

そもそも変数は型指定を特にしない時はデフォルトで実数型の設定なはずなので
必ず整数型を使わないと発生する可能性があるなら
ヘルプにでもその旨書いてあってもよさそうな気がしますけど
アバター
しんいち 2018/6/9 20:59 ◆lHy.hAWXbthn
あ〜、bit長は32でしたね。正しくは「整数型の値の範囲を超えることがある」ですね。
発生したコードは画面のようなやつです(画像配列のARGB分離)。これではARYOPでオーバーフローが発生しますが、普通に演算しても発生すると思います。

私的には、GSAVEが整数型の範囲外の値を返してしまうのは結構なバグだと思っているのですが、他の方にとってはそんなに気にならないのだろうか。RGB()関数やGSPOIT命令の返す値と一致しないことがあるのは、かなりマズいと思うんだけどなぁ。
#この現象が以前(前のバージョン)からなのかがとても気になる。
アバター
しんいち 2018/6/9 21:01 ◆lHy.hAWXbthn
画面貼り忘れてた^^;
アバター
ツララ 2018/6/9 21:57 ◆ArUdBYOYME1V
うわホントだ
実際に
VAR A%,B#
B#=4294506744
A%=B#
ってやるとオーバーフローする!
メンドクサー
要するに変数の型で確保してるメモリの幅が違うから整数化処理を挟んでやんないとダメってことー!?
回避するには、実数型の変数を整数型の変数に代入する場合は強制的に整数型に整形する<<0みたいな処理を入れるとかなのかな
言われないとこれ気が付かないわー

試しに
2147023096 (4294506744から二進数表記で32bit目を0に変えた数)を
B#=2147023096<<3
A%=B#
ってやったらオーバーフローはしなかったっス

実数型の変数を整数型の変数に代入すると自動的に小数点以下が切り捨てになって便利だから、私もこういう書き方は結構使ってましたけど
しんいちさんGJ!
アバター
ツララ 2018/6/9 22:20 ◆ArUdBYOYME1V
何か実数型で二進数表記にした時に32bit目以降が立ってる数は、シフト演算しただけでオーバーフローエラー出る・・・
ってことはMAX()関数やMIN()関数で-2147483648~2147483647の範囲に収まる様に丸め込んだ後じゃないと
シフト演算も使えないのかー

細かく調べて行けばスペックや仕様を確認してああ納得って感じで回避方法も探れるけど
命令の方で自動で型変換はやっておいて欲しいですよね

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -