Overflow numerico
Ecco come Java e linguaggi simili gestiscono un overflow numerico. Per illustrarlo, puoi scrivere un codice molto più semplice:
public static void main(String[] args)
{
int intV = Integer.MAX_VALUE;
System.out.println(intV + 1);
}
che produrrebbe -2147483648
come risultato.
Una risposta su StackOverflow spiega cosa succede sotto il cofano, "binario-parlato".
Nota che:
public static void main(String[] args)
{
int intV = Integer.MAX_VALUE;
long result = intV + 1;
System.out.println(result);
}
poiché la parte intV + 1
verrà valutata per prima, e solo dopo questo, il valore risultante sarà castato a long
. Tuttavia, ciò darebbe un risultato positivo, poiché l'aggiunta ora viene eseguita su un valore long
:
public static void main(String[] args)
{
int intV = Integer.MAX_VALUE;
long result = (long)intV + 1;
System.out.println(result);
}
Gestione specifica di short
Se giochi con il primo pezzo di codice della mia risposta, potresti finire per scrivere un codice come questo:
public static void main(String[] args)
{
short shortV = Short.MAX_VALUE;
System.out.println(shortV + 1);
}
Potresti essere sorpreso nel vedere che il risultato è 32768
, che sembra un non senso dal momento che short
può solo memorizzare valori da -32 768 a 32 767.
Questa è una particolarità di Java (e linguaggi simili come C #) in un modo in cui l'operatore +
funziona con valori di short
. Puoi avere un suggerimento su cosa sta succedendo scrivendo questo pezzo di codice:
public static void main(String[] args)
{
short a = 5;
short b = 4;
short c = a + b;
System.out.println(c);
}
Questo codice non verrà compilato:
error: incompatible types: possible lossy conversion from int to short
Ciò che accade è che l'operatore +
converte prima i valori di short
in numeri interi , quindi produce il risultato . Questo è il motivo per cui nel codice sopra riportato non si verifica un overflow numerico, poiché l'aggiunta viene eseguita su un intero effettivo ed è il valore di un numero intero passato a println
. D'altra parte, questo codice:
public static void main(String[] args)
{
short shortV = Short.MAX_VALUE;
short result = (short)(shortV + 1);
System.out.println(result);
}
visualizzerà -32768
, perché anche se l'aggiunta stessa ha dato come risultato 32768
, il cast di 32768
a breve ha generato un overflow numerico.