2015-11-17 10 views
21

Sto inizializzando due interi a e b.Numero intero tra parentesi che genera errore di compilazione

Compila per a ma c'è un errore per .

public class Main_1 { 
    public static void main(String[] args) { 
     int a = -2147483648; //Working fine 
     int b = -(2147483648); //Compilation error: The literal 2147483648 of type int is out of range 
    } 
} 

Perché è così?

+34

Il tipo di errore del compilatore fornisce un suggerimento su questo, vero? –

+0

Non è un suggerimento, è un errore ... :) –

risposta

50

La ragione è che il tipo di dati int ha valori validi nella gamma [-2147483648, 2147483647].

Quando si inserisce 2147483648 tra parentesi, diventa un'espressione che verrà valutata come int. Tuttavia, 2147483648 è troppo grande per rientrare in uno int (troppo grande di uno).

Il problema non si verifica per -2147483648 perché è un valore valido int.

parti pertinenti della JLS:

  • aggiunta parentesi crea una "parentesi Espressioni" (section 15.8.5)
  • un intero letterale, come 2147483648, viene trattata come int di default (section 3.10.1)

    Un numero intero letterale è di tipo long se è suffisso con una lettera ASCII L o l (ell); altrimenti è di tipo int (§4.2.1).

+0

Se l'espressione diventa int. Allora perché l'int dichiarato funziona bene. –

+10

@ShowStopper Guardalo in questo modo: '-2147483648' è valido, è il valore minimo. Comunque, scrivendo '- (2147483648)', c'è la necessità di prima valutare '2147483648' come un' int' (a causa delle parentesi), ma questo è troppo grande di 1. – Tunaki

+0

Grazie a @Tunaki quindi quello che capisco è parentesi sono parte dell'intero e conto per aumentare nell'intervallo intero –

11

valori int vanno da -2147483648 a 2147483647. Quindi -(2147483648) è OutOfRange perché il valore tra parentesi viene valutato come int. Il valore massimo si può mettere in parentesi è

Integer.MAX_VALUE //Which is equals to 2147483647 
4

valore massimo di int è 2147483647 e il valore min di int è -2147483648. Ma quando si inserisce 2147483648 in parentesi che inizialmente considera come +2147483648 e non è valido per l'intage.

1

int tipo di dati è un 32-bit signed two's complement integer.

Il valore minimo è - 2,147,483,648.(-2^31)

Il valore massimo è 2,147,483,647(inclusive).(2^31 -1)

7

L'errore di compilazione è abbastanza chiaro: si utilizza il valore letterale int che è fuori portata.Se si vuole veramente farlo, è possibile utilizzare long letterale:

int b = (int) -(2147483648L); 

O double letterale:

int b = (int) -(2147483648.0); 
2

Un buon modo per visualizzare questo è quello di guardare (int) -(2147483648) come:

(int) -1 * (2147483648) 

Quando viene valutato dal compilatore, dice, devo prima convertire il numero tra parentesi in un numero intero, quindi moltiplicarlo per il negativo 1. Procede quindi eds per eseguire un controllo di intervallo sul numero e scopre che è più grande di quello che può essere contenuto in un numero intero (2147483648), che è l'errore di compilazione.

Problemi correlati