Operatori aritmetici in Visual Basic

Gli operatori aritmetici vengono usati per eseguire molte delle operazioni aritmetiche più comuni che implicano il calcolo di valori numerici rappresentati da valori letterali, variabili, altre espressioni, chiamate di funzione e proprietà e costanti. Vengono classificati come operatori aritmetici anche gli operatori di spostamento bit, che agiscono a livello dei singoli bit degli operandi e spostano gli schemi di bit a sinistra o a destra.

Operazioni aritmetiche

È possibile sommare due valori in un'espressione con l'operatore + oppure sottrarre uno dall'altro con l'operatore - (Visual Basic), come illustrato nell'esempio seguente.

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

Anche per la negazione si usa l'operatore - (Visual Basic), ma con un solo operando, come illustrato nell'esempio seguente.

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

Per la moltiplicazione e la divisione si usano rispettivamente l'operatore * e l'operatore / (Visual Basic), come illustrato nell'esempio seguente.

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

Per l'elevamento a potenza si usa l'operatore ^, come illustrato nell'esempio seguente.

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

Per la divisione tra interi si usa l'operatore \ (Visual Basic). Nella divisione tra interi viene restituito il quoziente, ovvero il numero intero che rappresenta il numero di volte in cui il divisore può essere diviso con il dividendo senza considerare alcun resto. Per questo operatore sia il divisore che il dividendo devono essere tipi integrali (SByte, Byte, Short, UShort, Integer, UInteger, Long e ULong). Tutti gli altri tipi devono essere prima convertiti in un tipo integrale. Nell'esempio seguente viene illustrata la divisione tra interi.

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

Per l'aritmetica del modulo si usa l'operatore Mod. Questo operatore restituisce il resto dopo aver diviso il divisore per il dividendo un numero integrale di volte. Se sia il divisore che il dividendo sono tipi integrali, il valore restituito è integrale. Se il divisore e il dividendo sono tipi a virgola mobile, anche il valore restituito è a virgola mobile. Nell'esempio seguente viene illustrato questo comportamento.

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.

Tentativo di divisione per zero

La divisione per zero restituisce risultati diversi a seconda dei tipi di dati coinvolti. Nelle divisioni di numeri integrali (SByte, Byte, Short, UShort, Integer, UInteger, Long, ULong) .NET Framework genera un'eccezione DivideByZeroException. Nelle operazioni di divisione sul tipo di dati Decimal o Single .NET Framework genera anche un'eccezione DivideByZeroException.

Nelle divisioni di numeri a virgola mobile che coinvolgono il tipo di dati Double non viene generata alcuna eccezione e il risultato è il membro della classe che rappresenta NaN, PositiveInfinityo NegativeInfinity, a seconda del dividendo. La tabella seguente riepiloga i vari risultati dei tentativi di divisione di un valore Double per zero.

Tipo di dati del dividendo Tipo di dati del divisore Valore del dividendo Risultato
Double Double 0 NaN (non un numero definito matematicamente)
Double Double > 0 PositiveInfinity
Double Double < 0 NegativeInfinity

Quando si rileva un'eccezione DivideByZeroException, è possibile usare i relativi membri per gestirla. Ad esempio, la proprietà Message contiene il testo del messaggio per l'eccezione. Per altre informazioni, vedere Istruzione Try...Catch...Finally.

Operazioni di spostamento bit

Un'operazione di spostamento bit esegue uno spostamento aritmetico in uno schema di bit. Lo schema è contenuto nell'operando a sinistra, mentre l'operando a destra specifica il numero di posizioni per lo spostamento dello schema. È possibile spostare lo schema a destra con l'operatore >> o a sinistra con l'operatore <<.

Il tipo di dati dell'operando dello schema deve essere SByte, Byte, Short, UShort, Integer, UInteger, Long o ULong. Il tipo di dati dell'operando del numero di posizioni per lo spostamento deve essere Integer o essere esteso a Integer.

Gli spostamenti aritmetici non sono circolari e questo significa che i bit spostati da un'estremità del risultato non vengono reintrodotti all'altra estremità. Le posizioni dei bit liberate da uno spostamento vengono impostate nel modo seguente:

  • 0 per uno spostamento aritmetico a sinistra

  • 0 per uno spostamento aritmetico a destra di un numero positivo

  • 0 per uno spostamento aritmetico a destra di un tipo di dati senza segno (Byte, UShort, UInteger, ULong)

  • 1 per uno spostamento aritmetico a destra di un numero negativo (SByte, Short, Integer o Long)

Nell'esempio seguente un valore Integer viene spostato sia a sinistra che a destra.

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.

Gli spostamenti aritmetici non generano mai eccezioni di overflow.

Operazioni bit per bit

Oltre a essere operatori logici, Not, Or, And e Xor eseguono operazioni aritmetiche bit per bit quando vengono usati su valori numerici. Per altre informazioni, vedere "Operazioni bit per bit" in Operatori logici e bit per bit in Visual Basic.

Indipendenza dai tipi

Gli operandi devono essere in genere dello stesso tipo. Ad esempio, se si esegue la somma con una variabile Integer, è necessario sommarla a un'altra variabile Integer e assegnare il risultato a una variabile anch'essa di tipo Integer.

Uno dei modi da adottare per scrivere codice indipendente dai tipi consiste nell'usare l'istruzione Option Strict. Se si imposta Option Strict On, Visual Basic esegue automaticamente conversioni indipendenti dai tipi. Ad esempio, se si prova ad aggiungere una variabile Integer a una variabile Double e ad assegnare il valore a una variabile Double, l'operazione procede normalmente, perché un valore Integer può essere convertito in Double senza perdita di dati. Le conversioni non indipendenti dai tipi, invece, causano un errore del compilatore con Option Strict On. Ad esempio, se si prova ad aggiungere una variabile Integer a una variabile Double e ad assegnare il valore a una variabile Integer, viene restituito un errore del compilatore, perché una variabile Double non può essere convertita in modo implicito nel tipo Integer.

Se si imposta Option Strict Off, tuttavia, Visual Basic consente l'esecuzione di conversioni implicite che supportano un minor numero di dati, anche se possono comportare la perdita imprevista di dati o una minor precisione. Per questo motivo, è consigliabile usare Option Strict On durante la scrittura di codice destinato ad ambienti di produzione. Per altre informazioni, vedere Widening and Narrowing Conversions.

Vedi anche