2015-06-12 11 views
14

Perché il seguente codice non genera un errore?Perché posso generare il char oltre il valore massimo?

System.out.println((char) 2147483647); 

Secondo oracle datatypes, la dimensione massima per un char è 65,535.

  • char: Il tipo di dati char è un singolo carattere Unicode a 16 bit. Ha un valore minimo di '\ u0000' (o 0) e un valore massimo di '\ uffff' (o 65.535 inclusi).
+4

E cosa stampa? Non '2147483647'. Perchè no? C'è la tua risposta ... –

+0

Fa una conversione restringimento, 2147483647 è un int, e lo stai restringendo per essere un char. Come hai detto, il valore massimo per char è 65535. Se fai un, System.out.println ((int) (char) 2147483647); , lo vedrai stampato 65535 non 2147483647. HTH –

risposta

26

Perché è possibile generare char al di là del valore max?

2147483647 non è un char ma un int.

Non stai assegnando un valore non valido per un char, si sta gettando una valida int per char e poi Restringere conversione Primitive applicano regole. Vedi Java specs: §5.1.3.

In breve si mantengono bassi 16 bit di intero originale ("Una conversione restringimento di un intero con segno a un tipo integrale T scarta semplicemente tutti ma i bit di ordine n bassi, dove n è il numero di bit utilizzati per rappresentare tipo T. ").

Perché il seguente codice non genera un errore?

Perché non è un errore, è un comportamento ben definito.

+1

un 'int', non un' numero intero? – immibis

+0

@immibis non un 'intero', un 'int'! ;) Si Grazie. In origine era _integer_. –

-1

In realtà, la risposta alla tua domanda è non si può.

Perché non si vede alcun errore?
Perché Character.MAX_VALUE + 1 = Character.MIN_VALUE ... Stessa Integer.MAX_VALUE e altri, JVM lo tratta come un ciclo per evitare questo tipo di problemi ... ma dà risultati falsi quando si tenta di calcolare ....

Controllare this question per ulteriori e informazioni tecniche

+0

Overflow? No ... 16 bit MSB vengono semplicemente scartati. –

+1

@AdrianoRepetti Mi sto interrogando sulla domanda collegata .. ma come ho capito può * provare * a traboccare ... ma non succede ... –

+0

Non c'è overflow quando lanci. I dati più significativi sono semplicemente persi. Questo è lo stesso comportamento delle lingue più vecchie, come C++. Scegliere un primitivo è il modo in cui lo sviluppatore dice "Sì, so che perderò dati e accetto questa conseguenza". Pertanto, gli sviluppatori dovrebbero evitare la trasmissione a meno che * non * necessiti di *, perché il compilatore ti proteggerà dal fare cose stupide per sbaglio. – sfdcfox

0

Questo funziona con qualsiasi tipo di dati, si chiama integer overflow e quando si esegue il cast di qualsiasi bit oltre la dimensione del tipo a cui si sta eseguendo il cast viene interrotto.

+0

Mezza-metà. Sì, i byte vengono eliminati. No, niente a che fare con l'overflow. –

6

si esegue una conversione restringimento da int a char, che è consentito see java spec: 5.1.3. Narrowing Primitive Conversion:

Una conversione restringimento di un intero con segno a un tipo intero T scarta semplicemente tutti ma i bit di ordine n bassi, dove n è il numero di bit utilizzati per rappresentare il tipo T. Oltre a una possibile perdita di informazioni sull'entità del valore numerico, ciò potrebbe far sì che il segno del valore risultante differisca dal segno del valore di input.

Il numero char risultante non è maggiore di Character.MAX_VALUE. Il compilatore converte (char) 2147483647 a 65535

3

char è un tipo di dati a 16 bit a cui è possibile trasmettere un valore numerico.

Quando si lancia un numero intero a 32 bit su un cortocircuito a 16 bit (o su un carattere), si perdono i bit superiori della sorgente.

Int32 i = 2147483647; // 0x7FFFFFFF 
Int16 s = (Int16) i; //  0xFFFF (65535) 
char c = (char) i; //  0xFFFF (65535) 
Problemi correlati