Perché non consentire l'assegnazione int-to-short ma consentire la moltiplicazione e l'altra matematica?

4

In Java, il seguente codice non viene compilato:

int val = 1;
short shortVal = val;  // Incompatible types

Qualcuno sa perché Java scelga di lamentarsi di questo incarico, invece di limitarsi a troncare, quando un intero intero di tipo integer rischia anche di traboccare?

Per illustrare:

int val = 46340;
int result = val * val;                    // 2147395600
System.out.println(result);
int overflowVal = 46341;
int result2 = overflowVal * overflowVal;   // -2147479015
System.out.println("Quietly overflowed: " + result2);
    
posta Nicole 20.12.2011 - 19:37
fonte

5 risposte

12

Nel primo caso, il compilatore sa che stai affrontando una potenziale perdita di precisione, quindi può fermarti. Nel secondo caso l'overflow avviene durante un calcolo di runtime - sebbene il tuo esempio causi un overflow, non c'è modo per il compilatore di controllare tali occorrenze in generale, quindi non lo fa.

    
risposta data 20.12.2011 - 20:08
fonte
1

Int to Short è una conversione di tipo, e java richiede cast esplicito anche dove la conversione del tipo potrebbe essere dedotta automaticamente.

Il trattamento lassista di Java dei risultati errati dall'aritmetica dei numeri interi è separato importa. È una buona domanda perché l'overflow dei numeri interi non causa un runtime fa eccezione.

    
risposta data 20.12.2011 - 20:08
fonte
1

La mancata corrispondenza del tipo in un calcolo non è realmente un problema, poiché il risultato del calcolo è ancora definibile anche per gli operandi con dimensioni di bit differenti. Il problema dell'overflow aritmetico in fase di esecuzione è più generale, in quanto può verificarsi anche nei calcoli tra gli stessi operandi di dimensione bit, e non c'è chiaramente alcun punto che il compilatore ci avverta della possibilità che si possa avere un overflow ogni volta che incrementiamo un numero intero. Quindi, la domanda si riduce a perché java non offre qualcosa come la parola chiave 'checked' di C # in modo da offrire la possibilità di intercettare l'overflow aritmetico in fase di runtime. Ma questo sarebbe l'argomento di un'altra domanda.

    
risposta data 20.12.2011 - 21:03
fonte
0

L'int to short assignment è un errore di tipo nella definizione "computer science" del termine. L'intento è quello di impedire ai programmatori di fare accidentalmente qualcosa di brutto (come l'assegnazione di qualcosa in un corto che non può essere rappresentato in breve). Moltiplicare un int e un cortocircuito è anche tecnicamente un errore di tipo nella definizione di "scienze informatiche" del termine, ma qui vi è meno possibilità di errore dato che il sistema di tipi può decidere quale tipo rendere il risultato di un int x operazione breve. La maggior parte delle persone non vorrebbe lanciare i propri corti ai pollici ogni volta che la matematica viene eseguita con un breve e int, quindi i compilatori lo faranno per te.

In breve: con l'assegnazione, i tipi sono vincolati, non c'è spazio per cambiare idea. Con aritmetica, il sistema di tipi può decidere quale dovrebbe essere il tipo risultante, e sceglie un tipo compatibile in questo caso (int) e inserisce qualsiasi cast richiesto per te.

    
risposta data 21.12.2011 - 03:14
fonte
0

Sarebbe strano se int * int = long. Internamente, questo è esattamente ciò che i processori (x86) fanno comunque, ma farebbe alcune sfide di programmazione piuttosto interessanti. L'overflow occasionale è più facile da gestire rispetto alla retrocessione automatica ogni volta che esegui un'operazione!

Quindi, in breve, è impedito int to short perché è facile da prevenire. Il trabocco int / int è consentito piuttosto che upcasting perché l'upcasting potrebbe causare ancora più bruttezza. Sembra una decisione di progettazione basata sul minore dei mali multipli.

    
risposta data 21.12.2011 - 15:10
fonte

Leggi altre domande sui tag