>
コード: 全て選択
> #prompt
>
> Dim D As Double
>
> D=2147483647+1
>
> Print "D=";D
>
>
> このとき表示される値は、
> 2147483647+1=「2147483648」
> だと思ったのですが、
> 実際の実行結果は
> 「-2147483648」
> と符号が負になってしまいます。
>
> 仮に代入時に
> D=2147483648 と入れればもちろん
> そのまま正の数として表示されます。
>
> Long型ならこのような実行結果になっても分かるような
> 気はするのですが。
Ver4.20を使っても同じことです。
例えば
コード: 全て選択
#prompt
Dim D As Double
D = 18446744073709551616 + 1
Print "D=";D
とすれば希望(?)の結果は得られないでしょう。
(変わったことは,64bitで計算しているので桁あふれが先に伸びただけのことです。)
なぜなら、
先に,2147483647+1がLong型として計算されます。
ご存知のとおり、2の補数表現では
&h00000000 0
&h00000001 1
:
:
&H7FFFFFF 2147483647
&H70000000 -2147483648
&H70000001 -2147483647
:
&HFFFFFFFF -1
と符号化されています。
ですから当然、
2147483647+1 が -2147483648 になるのは正しい結果です。
2147483647+1をdouble型で計算したい場合は、
2147483647.0 + 1
2147483647 + 1.0
2147483647.0 + 1.0
または、As doubleで型変換をしてください。
4.04では実装されていませんが、
#strict
をつけるなら、
データが失われる危険があることを、コンパイラーが警告します。