2013-01-15 15 views
5

Eventuali duplicati:
char and int in JavaPerché è consentito assegnare char ad un int in java?

tabella AsicII: http://www.asciitable.com

Il seguente codice stampa il valori Dec del char corrispondente, ad esempio, "123" -> 49 50 51

public void foo(String str) 
     { 
      for(int x = 0; x < str.length(); x++) 
      { 
       int temp = str.charAt(x); 
       System.out.println(temp); 
      } 
     } 

Ma noto che java è un linguaggio di tipo forte, il che significa che ogni cosa deve essere lanciata in fase di compilazione, ma come mai il codice sa come e quando convertire il char nel valore Dec corretto nella tabella AsicII? Ho sbagliato qualche java/programmazione fondamentale?

+0

Questa è una buona domanda; è strano che Java autorizzi il casting automatico dai caratteri agli inte, data la sua predisposizione ai tipi forti. +1 – BlackVegetable

+3

Java consente il casting automatico da un tipo più piccolo a un più alto. Solleva un errore di compilazione se provi a farlo implacabilmente al contrario. – aldrinleal

+0

Puoi includere un esempio in cui potresti farlo accidentalmente e introdurre un bug? –

risposta

8

Un char è semplicemente un numero senza segno a 16 bit, così visto che è fondamentalmente un sottoinsieme del tipo int, JVM può lanciare senza alcuna ambiguità.

+0

Hmm, questa logica ti farebbe pensare di poter eseguire il cast senza modificare il valore di rappresentazione ... quindi "1" verrebbe impostato su "1" non 49 o qualsiasi altra cosa. – BlackVegetable

+0

La rappresentazione e il valore non sono la stessa cosa. Due cose possono avere lo stesso valore (ad esempio 49), ma una rappresentazione diversa '1' per char e 49 per int. Non so se ti sto confondendo ancora di più ... scusa .. – mprivat

+0

Nah, hai ragione. Ho usato i termini sbagliati. Suppongo che potrebbe lanciarlo come fa, altrimenti dovrebbe disabilitare tutti i cast int>> poiché solo 0-> 9 avrebbe senso. – BlackVegetable

2

Java è stata fatta in base a C, e questo è una caratteristica di C: caratteri rappresentano un numero così

come tipi scalari, però, c'è un problema: - la stampa di un char produrrà il carattere ascii - stampare un int produrrà il numero

ci sono anche alcuni dettagli su upcast e abbattuto (int per essere convertito in un char, deve essere fatto esplicitamente, in quanto v'è una certa troncamento coinvolti)

Esempio:

long a = 1L; // a real long 
long n = 5; // int, cast to long 
int x = n; // (will raise an error) 
int z = (int) n; // works fine 
2

char ha una doppia personalità.

È un tipo numerico intero senza segno a 16 bit, che rende l'assegnazione a int un'operazione molto naturale, che comporta l'ampliamento della conversione primitiva, una delle conversioni che il compilatore inserirà se necessario senza richiedere un cast esplicito.

È anche il modo in cui i caratteri vengono rappresentati per operazioni di I/O e String.

Problemi correlati