Perché l'aggiunta di valori positivi in Java o C # a volte produce un valore negativo?

0

Stavo giocando con le variabili in Java.

public class Hello {
    public static void main(String[] args) {
        byte byteV = 127;
        short shortV = Short.MAX_VALUE;
        int intV = Integer.MAX_VALUE;
        System.out.println("Short: " + shortV + ", Integer: " + intV);
        long longV = (10 * byteV) + shortV + intV;

        System.out.println(longV);
    }
}

La variabile longV stampa un numero negativo, anche se tutte le altre variabili sono positive. Perché?

    
posta Infinitibyte 26.06.2016 - 14:04
fonte

1 risposta

3

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.

    
risposta data 26.06.2016 - 15:05
fonte

Leggi altre domande sui tag