コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
あまさとしおん ◆mzDKTVUAtwqE
2018/6/20 19:59
【妙な挙動】
乗算演算子の右側が整数型"変"数だと、計算結果が整数型になる結果として、突然マイナスになる。
乗算演算子の右側が整数型"定"数だと、計算結果はプラスになる。


A%=29128:?100645*A%
?100645*29128

コメント

アバター
おちゃめ 2018/6/20 22:55 ◆jH1opV6FnGyx
整数型同士、かつ、正数値同士の演算なのに結果が負数になるのはプチコン3号の仕様です。

twitterの方でも書きましたが、プチコン3号は整数型の定数同士の演算であればコンパイル時に自動的に定数値に置き換わるため演算結果が整数型の範囲内の値であれば整数型となり、整数型の範囲外であれば実数型となります。
各値が整数型の値であろうと実数型であろうと結果がすべてです。

(例)1.5*2.0
 結果が3であるため「3.0」という実数型の値ではなく「3」という整数型の値になる。(整数型の範囲内の値なので強制的に整数型になる)
(例)123456*98765
 結果が整数型で表せる範囲外の値になるため121939131840という実数型の値になる。

しかし、整数型定数と整数型変数の演算においてはコンパイル時の置き換えが行われないため実行時に整数型として処理されます。その際に整数型の範囲を超える値になった場合は自動的に下位32bitを取り出した整数値となります。

(例)A%*98765(ただし、A%=123456)
結果は整数型で表せる範囲外の数になるため強制的に32bitを取り出し、-691770048という整数型の値となる。

正数同士の演算で負数になった場合はオーバーフローによるキャリーフラグが立った状態として考えれば分かりやすいです。(負数×正数だと範囲外の値になった際には正数となる)
正数同士の演算で結果が負数になった場合は出てきた値に1<<31を足せば整数型で扱える範囲(2の31乗)を超過した値になります。

(例)A%*98765+(1<<31) (ただし、A%=123456)
 結果は1455713600という整数型の値になる。これはA%*98765 MOD 2147483648と同等の値である。(ちなみにMODは整数部が整数型で表せない値は演算ができない)
 あと、1<<31は-2147483648という値になる。

ちなみに整数型の定数と整数型の変数の演算においても除算の場合は常に実数型として処理されます。

(例)1234/A%(ただし、A%=2)
 結果は617で整数型の範囲内の値ですが、実数型(617.0と同等)の値となる。

定数の整数値を実数型として明示したい場合は1.0のように「.0」を付けるのがベターです。

(例)A%*98765.0(ただし、A%=123456)
 実数型の値が含まれるため演算は実数型として行われ演算結果も121939131840という実数型の値になる。
アバター
あまさとしおん 2018/6/21 15:41 ◆mzDKTVUAtwqE
定数と変数で挙動が違うので怪しんでいましたが「定数の事前計算」の仕業だったのですね
納得。

コメントを書く

この投稿にはコメントできません。

- WEB PATIO -