Visual Basic における算術演算子

算術演算子を使うと、リテラル、変数、その他の式、関数やプロパティの呼び出し、および定数によって表される数値の計算を含む一般的な算術演算を実行できます。 また、ビット シフト演算子も算術演算子に分類されます。ビット シフト演算子はオペランドの個々のビットを操作し、オペランドのビット パターンを左または右にシフトします。

算術演算

式の中の 2 つの値を足す場合は + 演算子 (Visual Basic) を使い、一方の値からもう一方の値を引く場合は - 演算子 (Visual Basic) を使います。次に例を示します。

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) を使い、除算には / 演算子 (Visual Basic) を使います。次に例を示します。

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

指数演算には ^ 演算子 (Visual Basic) を使います。次に例を示します。

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

整数の除算には \ 演算子 (Visual Basic) を使用します。 整数の除算は商を返します。商とは、被除数を除数で割った値を、余りを無視して表した整数です。 この演算子の場合、除数と被除数はどちらも整数型 (SByte、Byte、Short、UShort、Integer、UInteger、Long、ULong) であることが必要です。 他のデータ型を使用する場合は、先に整数型に変換する必要があります。 次に整数の除算の例を示します。

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

剰余演算には Mod 演算子 (Visual Basic) を使います。 この演算子は、被除数を除数で割った余りを返します。 除数と被除数が両方とも整数型の場合、戻り値は整数型になります。 除数と被除数が両方とも浮動小数点型の場合、戻り値は浮動小数点型になります。 次にコード例を示します。

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 による除算の結果は、含まれているデータ型によって異なります。 整数の除算 (SByte、Byte、Short、UShort、Integer、UInteger、Long、ULong) では、.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 プロパティには例外のメッセージ テキストが格納されています。 詳細については、「Visual Basic の構造化例外処理の概要」を参照してください。

ビット シフト演算

ビット シフト演算は、ビット パターン上で算術シフトを実行します。 パターンは左側のオペランドに指定し、右側のオペランドにはパターンをシフトする位置の数を指定します。 パターンを右へシフトする場合は >> 演算子 (Visual Basic) を使い、左へシフトする場合は << 演算子 (Visual Basic) を使います。

左側のオペランドのデータ型は SByte、Byte、Short、UShort、Integer、UInteger、Long、ULong である必要があります。 右側のオペランドのデータ型は Integer または Integer を拡張したデータ型であることが必要です。

数値のシフトは、循環的には行われません。つまり、一方の端からはみ出したビットが、もう一方の端に補われることはありません。 シフトによって空いたビット位置は、次のように設定されます。

  • 算術左シフトでは 0

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

  • 符号のないデータ型の算術右シフトでは 0 (Byte、UShort、UInteger、ULong)

  • 負の数 (SByte、Short、Integer、または 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.

数値のシフトではオーバーフロー例外は発生しません。

ビット処理演算

Not、Or、And、Xor の各演算子は、論理演算子として機能する他に、数値に対して使用された場合はビットごとの算術演算子としても機能します。 詳細については、「Visual Basic の論理演算子とビット処理演算子」の「ビット処理演算」を参照してください。

タイプ セーフ

オペランドは、通常同じ型である必要があります。 たとえば、Integer 型の変数を加算するときには、この変数を別の Integer 変数に加算し、結果も同じく Integer 型の変数に代入する必要があります。

コードをタイプ セーフに保つための 1 つの方法として、Option Strict ステートメント を使用できます。 Option Strict On を設定すると、Visual Basic はタイプ セーフな変換を自動的に実行します。 たとえば、Integer 型の変数を Double 型の変数に加算し、その値を Double 型の変数に代入する場合は、Integer 値から Double 型への変換ではデータが失われる可能性がないため、演算は正常に処理されます。 一方、タイプ セーフではない変換の場合は、Option Strict On を設定してしているとコンパイラ エラーが発生します。 たとえば、Integer型 の変数を Double 型の変数に加算し、その値を Integer 型の変数に代入しようとすると、Double の変数を暗黙的に Integer 型に変換できないため、コンパイラ エラーが発生します。

一方、Option Strict Off を設定していると、Visual Basic は暗黙の縮小変換を許可します。ただし、これによって予測不可能なデータまたは精度の欠落が起こる可能性があります。 このため、実稼動用のコードを作成する際には、Option Strict On を設定することをお勧めします。 詳細については、「拡大変換と縮小変換 (Visual Basic)」を参照してください。

参照

参照

算術演算子 (Visual Basic)

ビット シフト演算子 (Visual Basic)

概念

Visual Basic における比較演算子

Visual Basic の連結演算子

Visual Basic の論理演算子とビット処理演算子

演算子の効率のよい組み合わせ (Visual Basic)