Visual Basic における算術演算子

算術演算子は、リテラル、変数、その他の式、関数およびプロパティの呼び出し、および定数によって表される数値の計算に関連する一般的な算術演算の多くを実行するために使用されます。 また、算術演算子で分類されるのはビット シフト演算子です。これは、オペランドの個々のビットのレベルで機能し、ビット パターンを左または右にシフトします。

算術演算

次の例に示すように、+ 演算子を使用して式の中の 2 つの値を加算したり、- 演算子 (Visual Basic) を使用して 1 つの値を別の値から減算したりできます。

Dim x As Integer
x = 67 + 34
x = 32 - 12

また、否定でも - 演算子 (Visual Basic) を使用しますが、次の例に示すように、オペランドは 1 つだけです。

Dim x As Integer = 65
Dim y As Integer
y = -x

乗算と除算では、次の例に示すように、それぞれ * 演算子/ 演算子 (Visual Basic) を使用します。

Dim y As Double
y = 45 * 55.23
y = 32 / 23

指数では、次の例に示すように、^ 演算子を使用します。

Dim z As Double
z = 23 ^ 3
' The preceding statement sets z to 12167 (the cube of 23).

整数除算は、\ 演算子 (Visual Basic) を使用して実行されます。 整数除算は商を返します。これは、除数が余りを考慮せずに被除数に分割できる回数を表す整数です。 除数と被除数は両方とも、この演算子の整数型 (SByteByteShortUShortIntegerUIntegerLong、および ULong) である必要があります。 その他のすべての型は、最初に整数型に変換する必要があります。 整数除算の例を次に示します。

Dim k As Integer
k = 23 \ 5
' The preceding statement sets k to 4.

剰余演算は、Mod 演算子を使用して実行されます。 この演算子は、除数を被除数に整数回除算した後の剰余を返します。 除数と被除数の両方が整数型の場合、戻り値は整数です。 除数と被除数が浮動小数点型の場合は、戻り値も浮動小数点です。 次の例でその動作を示します。

Dim x As Integer = 100
Dim y As Integer = 6
Dim z As Integer
z = x Mod y
' The preceding statement sets z to 4.
Dim a As Double = 100.3
Dim b As Double = 4.13
Dim c As Double
c = a Mod b
' The preceding statement sets c to 1.18.

0 による除算を試行

0 による除算の結果は、関連するデータ型によって異なります。 整数除算 (SByteByteShortUShortIntegerUIntegerLongULong) では、.NET Framework は DivideByZeroException 例外をスローします。 Decimal または Single データ型の除算演算では、.NET Framework は DivideByZeroException 例外もスローします。

Double データ型を含む浮動小数点除算では、例外はスローされず、結果は被除数に応じて NaNPositiveInfinity、または NegativeInfinity を表すクラス メンバーになります。 次の表は、Double 値を 0 で除算しようとした場合のさまざまな結果をまとめたものです。

被除数データ型 除数データ型 除算される値 結果
Double Double 0 NaN (数学的に定義された数値ではありません)
Double Double > 0 PositiveInfinity
Double Double < 0 NegativeInfinity

DivideByZeroException 例外をキャッチした場合は、そのメンバーを使用して処理することができます。 たとえば、Message プロパティは、例外のメッセージ テキストを保持します。 詳しくは、「Try...Catch...Finally ステートメント」をご覧ください。

ビット シフト演算

ビット シフト演算は、ビット パターンに対して算術左シフトを実行します。 パターンは左側のオペランドに含まれていますが、右側のオペランドは、パターンをシフトする位置の数を指定します。 パターンを右にシフトするには >> 演算子を使用し、左にシフトするには << 演算子を使用します。

パターンのオペランドのデータ型は、SByteByteShortUShortIntegerUIntegerLong、または ULong である必要があります。 シフト数のオペランドのデータ型は、Integer であるか、Integer に拡大変換する必要があります。

算術シフトは循環ではありません。つまり、結果の一方の端からシフトされたビットはもう一方の端には再入されません。 シフトによって空いたビット位置は、次のように設定されます。

  • 算術左シフトの場合は 0

  • 正の数の算術右シフトの場合は 0

  • 符号なしのデータ型 (ByteUShortUIntegerULong) の算術右シフトの場合は 0

  • 負の数 (SByteShortInteger、または Long) の算術右シフトの場合は 1

次の例では、Integer 値を左右にシフトします。

Dim lResult, rResult As Integer
Dim pattern As Integer = 12
' The low-order bits of pattern are 0000 1100.
lResult = pattern << 3
' A left shift of 3 bits produces a value of 96.
rResult = pattern >> 2
' A right shift of 2 bits produces value of 3.

算術シフトではオーバーフロー例外は生成されません。

ビットごとの演算

論理演算子に加えて、NotOrAnd、および Xor は、数値に対して使用する場合にビットごとの算術演算も実行します。 詳細については、「Visual Basic の論理演算子とビット処理演算子」の「ビットごとの演算」を参照してください。

タイプ セーフ

通常、オペランドは同じ型である必要があります。 たとえば、Integer 変数を使用して加算を行う場合は、それを別の Integer 変数に追加し、その結果を Integer 型の変数にも代入する必要があります。

タイプセーフなコーディングを確実に行うための 1 つの方法として、Option Strict ステートメントを使用する方法があります。 Option Strict On を設定すると、Visual Basic では、タイプセーフな変換が自動的に実行されます。 たとえば、Double 変数に Integer 変数を追加し、その値を Double 変数に代入しようとすると、データを失うことなく Integer 値を Double に変換できるため、操作は正常に続行されます。 一方、タイプセーフでない変換では、Option Strict On でコンパイラ エラーが発生します。 たとえば、Double 変数に Integer 変数を追加し、その値を Integer 変数に代入しようとすると、コンパイラ エラーが発生します。これは、Double 変数を型 Integer に暗黙的に変換できないためです。

ただし、Option Strict Off を設定した場合、Visual Basic は暗黙的な縮小変換を行うことができますが、予期しないデータまたは精度の損失が発生する可能性があります。 このため、運用コードを記述するときには Option Strict On を使用することをお勧めします。 詳細については、「 Widening and Narrowing Conversions」を参照してください。

関連項目