2013-01-02 44 views
10

Recentemente ho notato un'idiosincrasia di Java riguardante le operazioni aritmetiche di base in Java. Con questo codiceOperazioni aritmetiche di base su int - Java

byte a = 3; 
byte b = 4; 
byte c = a * b; 

ottengo un errore di compilazione "tipo non corrispondente" ...

sono operazioni aritmetiche di base in Java (+, -, *, /) eseguite solo sui tipi di dati primitivi di int e ordine superiore (long, double, ecc.), mentre le operazioni aritmetiche su byte e short vengono trasmesse per la prima volta a int e quindi valutate?

+0

Buona domanda. Onestamente non conoscevo la risposta, ma ho trovato questo. http://mindprod.com/jgloss/multiplication.html – Zutty

risposta

15

Operazioni sui byte, char e short sono allargati al int a meno che il compilatore in grado di determinare il valore è in campo.

final byte a = 3, b = 4; 
byte c = a * b; // compiles 

final byte a = 3, b = 40; 
byte c = a * b; // compiles 

final int a = 3, b = 4; 
byte c = a * b; // compiles !! 

ma

byte a = 3, b = 4; 
byte c = a * b; // doesn't compile as the result of this will be `int` at runtime. 

final byte a = 30, b = 40; 
byte c = a * b; // doesn't compile as the value is too large, will be an `int` 

BTW Questo compila anche se si traduce in un overflow. :]

final int a = 300000, b = 400000; 
int c = a * b; // compiles but overflows, is not made a `long` 
+0

Ouch, non sapevo che "final" avrebbe fatto una differenza di qui. Ma sembra strano comunque, dal momento che anche nel secondo esempio, 'a' e' b' sono ancora dichiarati come byte ... – fge

+2

* a meno che il compilatore possa determinare il valore nell'intervallo * <=> è una ** costante ** espressione che è nel raggio d'azione. – assylias

7

Il risultato di operazioni con numero intero è int o long. Questo è spiegato nello JLS:

4.2.2. Integer Operazioni

Gli operatori numerici, che si traducono in un valore di tipo int o long:

  • Il plus unario e meno operatori + e - (§15.15.3, §15.15.4)

  • Gli operatori moltiplicativi *,/e% (§15.17)

  • Gli operatori additivi + e - (15,18)

  • ...

Also:

5.6.2. Binario numerico Promozione

Quando un operatore applica promozione numerico binario ad una coppia di operandi, ciascuno dei quali deve indicare un valore che è convertibile in un tipo numerico, si applicano le regole seguenti, nell'ordine:

Allargamento primitiva conversione (§5.1.2) viene applicato per convertire uno o entrambi gli operandi come specificato dalle seguenti regole:

  • Se uno degli operandi è di tipo double, l'altro viene convertito a raddoppiare.

  • Altrimenti, se uno degli operandi è di tipo float, l'altro viene convertito in float.

  • In caso contrario, se uno degli operandi è di tipo lungo, l'altro viene convertito in long.

  • In caso contrario, entrambi gli operandi vengono convertiti in tipo int.

...

promozione numerico binario viene eseguita su operandi di alcuni operatori:

  • Gli operatori moltiplicativi *,/e% (§15.17)

  • Gli operatori di addizione e sottrazione per i tipi numerici + e - (§15.18.2)

  • Gli operatori di confronto numerici <, < =,> e> = (§15.20.1)

  • Gli operatori di uguaglianza numerici == e! = (§15.21.1)

  • Il numero intero bitwise operatori &, ^, e | (§15.22.1)

  • In alcuni casi, l'operatore condizionale? : (§15.25)