算術演算子は、リテラル、変数、その他の式、関数とプロパティの呼び出し、および定数によって表される数値の計算を含む使い慣れた算術演算の多くを実行するために使用されます。 また、算術演算子で分類されるビットシフト演算子は、オペランドの個々のビットのレベルで動作し、ビット パターンを左または右にシフトします。
算術演算
次の例に示すように、式に 2 つの値を + 演算子と共に追加するか、 - 演算子 (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) をそれぞれ使用します。
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) を使用して行います。 整数除算は商を返します。つまり、除数が剰余を考慮せずに被除数に分割できる回数を表す整数です。 除数と被除数は、この演算子の整数型 (SByte
、 Byte
、 Short
、 UShort
、 Integer
、 UInteger
、 Long
、および 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 で除算すると、関係するデータ型によって結果が異なります。 整数分割 (SByte
、 Byte
、 Short
、 UShort
、 Integer
、 UInteger
、 Long
、 ULong
) では、.NET Framework は DivideByZeroException 例外をスローします。
Decimal
またはSingle
データ型に対する除算操作では、.NET Framework もDivideByZeroException例外をスローします。
Double
データ型を含む浮動小数点分割では例外はスローされず、結果は被除数に応じて、NaN、PositiveInfinity、またはNegativeInfinityを表すクラス メンバーになります。 次の表は、 Double
値を 0 で除算しようとしたさまざまな結果をまとめたものです。
被除数データ型 | 除数データ型 | 被除数値 | 結果 |
---|---|---|---|
Double |
Double |
0 | NaN (数学的に定義された数値ではありません) |
Double |
Double |
> 0 | PositiveInfinity |
Double |
Double |
< 0 | NegativeInfinity |
DivideByZeroException例外をキャッチすると、そのメンバーを使用して処理を支援できます。 たとえば、 Message プロパティは、例外のメッセージ テキストを保持します。 詳細については、「 Try...」を参照してください。捕まえる。。。Finally ステートメント。
Bit-Shift 操作
ビットシフト演算は、ビット パターンに対して算術シフトを実行します。 パターンは左側のオペランドに含まれますが、右側のオペランドはパターンをシフトする位置の数を指定します。 パターンは、 >> 演算子 を使用して右にシフトするか、 << 演算子を使用して左にシフトできます。
パターン オペランドのデータ型は、 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
を使用することをお勧めします。 詳細については、「 拡大/縮小変換」を参照してください。
こちらも参照ください
.NET