1

このコードは正常にコンパイルされますが、実行中に Visual Studio 2013 で System.OverflowException が発生します。

Sub Main()
    Dim a As ULong = 14345389830683080345D
    Dim c As ULong = 1

    Dim x As ULong = a And 1 '<-- cause System.OverflowException
    Dim y As ULong = a And c '<-- works well
End Sub

なぜこれが起こるのか説明できますか?また変数の値が小さい場合 (例: 5)、例外は発生しません。

PS 変数の最上位 3 ビットはすべてゼロです。

4

1 に答える 1

2

ULong と Integer でビットごとの 'And' を使用した結果は 'Long' です。これが最初のケースです。オーバーフローは割り当てでは発生していませんが、「And」式自体の評価では発生していません。「Long」には収まりません。ULong と ULong の結果は 'ULong' です - これは 2 番目のケースです。

これらの値の型は重要です。リテラル '1' のデフォルトは 'Integer' です。

ところで、これらの結果を見つける簡単な方法は、Option Infer On を設定し、「Dim v = 1 And 2」などの例を VB で入力し、カーソルを合わせてコンパイラの「v」の入力を表示することです。

于 2015-03-03T21:05:46.013 に答える