2015-12-29 9 views
9

In questo frammento di codice:Che cos'è il punto di casting del tipo?

c = (char)(c - 'A' + 'a'); 

Perché abbiamo bisogno del (char)? Questo tipo di casting è giusto?

Si supponga che lo c sul lato destro dell'istruzione di assegnazione sia una lettera maiuscola. Presumo che stiamo facendo addizione e sottrazione Unicode qui.

Questo è il frammento del libro Java che sto leggendo:

Quando aritmetica è fatto su un char, è prima convertito alla int che lo rappresenta nel sistema Unicode. Sottraendo "A" da una variabile si chiede in sostanza "Fino a che punto le lettere maiuscole sono il carattere in c?" L'aggiunta di "a" restituisce l'int che è la stessa distanza nella sequenza dell'alfabeto minuscolo codice del personaggio. Il cast in char è necessario perché char è un tipo speciale di int con un intervallo di valori più limitato. Usando il cast, il programmatore riconosce che lui o lei capisce la natura particolare l'assegnazione e si aspetta il valore di essere nel range corretto, da 0 a 66535.

Non capisco il punto del cast (char)? Cosa sarebbe diverso se non usassimo il cast (char)? Qual è il casting più in generale?

+1

In parole semplici: In java numero 8 può essere preso come carattere e non intero .... quindi 8 + 8 può giv 88 e non 16 ... poiché 8 dovrebbe essere considerato come numero intero per l'operazione airmetic, noi type caste come 'int' –

risposta

7

char è un integral type in Java, e quando si esegue l'aritmetica Il risultato è un int (JLS-4.2.2. Integer Operations dice, in parte, gli operatori numerici, che si traducono in un valore di tipo int o long e aggiunge che include gli operatori additivi + e -).

char c = 'A'; 
System.out.printf("'%c' = %d%n", c, (int) c); 
int d = (c - 'A' + 'a'); // c - 65 + 97 
System.out.printf("'%c' = %d%n", (char) d, d); 

E ho

'A' = 65 
'a' = 97 
+0

Ho bisogno di decifrare quei formati stringa ... – Jwan622

+1

% contrassegna una variabile, c è per char, d per decimale, n per newline, le variabili sono fornite nello stesso ordine come nella stringa come parametri alla fine. Per un elenco di cose che puoi fare nei formati puoi vedere https://docs.oracle.com/javase/tutorial/java/data/numberformat.html – HopefullyHelpful

+1

Anche i flag possono essere usati tra il% e il tipo di variabile, ad es. . '% 10d' formatta un numero in modo che occupi 10 caratteri (pieni di spazi o 0) – HopefullyHelpful

7

Ciò è dovuto alla numeric promotion. Citando il JLS section 15.18.2:

Il + operatore binario esegue aggiunta quando applicata a due operandi di tipo numerico, producendo la somma degli operandi.

L'operatore binario - esegue la sottrazione, producendo la differenza di due operandi numerici.

La promozione numerica binaria viene eseguita sugli operandi (§5.6.2).

La promozione numerica in questo caso è un widening primitive conversion. Citando section 5.6.2:

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

  • Altrimenti, entrambi gli operandi sono convertiti a digitare int.

Quindi nel tuo esempio, il cast di char è necessario in quanto l'aggiunta viene eseguita su un valore int, quindi il risultato è anche di tipo int. Per memorizzare questo in un char, è necessario un cast esplicito.

2

Tutto ciò che si fa nella programmazione è dare valori alle variabili. Quelle variabili possono essere di diversi tipi. Alla fine tutto è un numero che viene gestito in un certo modo o una sequenza/insieme di numeri gestiti come una "entità". Variabili di diversi tipi possono occupare una diversa quantità di spazio.

Se hai 2 cose gestite in modi diversi e occupando diverse quantità di spazio, hai bisogno di un modo ben definito per convertire tra le 2 cose, questo è fatto da casting e operatori. Un operatore prende un numero di input e fornisce un'uscita. + e - di solito prendono 2 input e restituiscono 1.

Nel tuo caso hai usato operatori che prendono caratteri, prendono i loro bit e li usano come numeri e restituiscono il numero risultante come int. Quindi devi convertire quel numero in una lettera manualmente, perché potresti perdere dei byte. Anche il cast esplicito qui impedisce errori da parte dei programmatori che gestiscono numeri e li converte accidentalmente in una lettera, vengono avvertiti dal compilatore. Alla fine tutto si riduce alle specifiche che dichiarano esattamente cosa succede per ogni tipo di input e ciascun operatore.

La maggior parte delle volte il casting è fatto per darti un modo semplice e intuitivo di convertire i tipi, quando c'è un modo. Il più delle volte questo viene fatto con numeri, perché l'unica differenza è la quantità di morsi forniti (byte, short, int, long) e talvolta il calcolo interno (float, double). In questi casi, il taglio e l'arrotondamento sono facili da eseguire e raggiunti eseguendo il casting su un tipo con meno byte o una rappresentazione intera, e aggiungendo byte o modificando la rappresentazione in virgola decimale si esegue la fusione di un tipo con più byte o un tipo con virgola mobile rappresentazione.

D'altra parte ci sono momenti in cui si desidera trattare un oggetto come un caso più generale e trasmetterlo a un tipo di antenato (chiamato anche super-tipo ecc.). Per esempio. quando si ordinano gli oggetti, non si cura del tipo esatto da gestire quando si scrive un algoritmo di ordinamento.

Problemi correlati