hra1129 / msx_basic_compiler

MSX-BASICコンパイラ
MIT License
22 stars 2 forks source link

整数型のオーバーフローについて #16

Closed baseballcap-mio closed 5 months ago

baseballcap-mio commented 6 months ago

下のプログラムを実行するとBASICでは120行でオーバーフローとなるがBACONでは正常終了する。 130行のコメントを外すと、BACONでは32767と表示される。

100 DEFINT A-Z 110 AD=&H8000 120 AD=AD-1 130 'PRINT AD 140 END

hra1129 commented 5 months ago

これについては、仕様です。 MSXべーしっ君と同様、演算時のオーバーフローチェックは甘くなっています。 エラーチェックを BASIC と同じに全部処理しようとすると、その負荷で「高速化」のメリットが殆ど無くなってしまうためです。 &H8000 は-32768 なので、-1 すると循環して 32767 になります。これは &H7FFF ですので、 BACONとしては正しい挙動になります。

同様に、演算をある程度割り切っている部分もあります。

DEFINT A-Z A=ABS(-32768)

これは正常に機能しません。 整数型の表現範囲が -32768~32767 で、32768 を表現できないためです。 MSX-BASIC では、この時点で単精度実数に格上げされるわけですが、 MSX-BACON では、コンパイル時に型を決め打ちで、ABS は引数の型に決め打つので ABS(-32768) は -32768 になる仕様と割り切っています。

このあたりも、いずれ「MSX-BASIC と MSX-BACON の違い」として説明書にまとめたいと思います。

baseballcap-mio commented 5 months ago

了解しました。