2015-06-27 8 views
5
char c1 = 123; //Compiles fine 
char c2 = 123456; //Error: cannot convert from int to char 

Java è abbastanza intelligente per determinare se un numero intero è sufficientemente piccolo per essere convertito in un carattere. Perché non è in grado di convertire letterali in virgola mobile molto piccoli in un float ?. Ad esempio:char c = alcuni valori letterali interi potrebbero essere compilati ma float f = alcuni letterali in virgola mobile non verranno mai compilati. Perché?

float f1 = 0.3; //Error: cannot convert from double to float 
float f2 = 0.3f; //Compiles fine 

char c = qualche intero letterale potrebbe compilare ma float f = certo punto floating letterale sarà mai compilazione. Perché?

PS: So che una virgola mobile letterale è trattato come un doppio predefinita

+0

possibile duplicato di [Java: Perché è necessario specificare una "f" in un valore letterale float?] (Http://stackoverflow.com/questions/14102955/java-why-do-you-need- to-specific-af-in-a-float-literal) – RealSkeptic

+0

La mia domanda non riguarda la 'f' in letterali in virgola mobile. Riguarda come un tipo di dati più grande viene convertito in un tipo di dati più piccolo senza problemi in un caso (int a char, da 32 bit a 16 bit) mentre dà un errore di compilazione nell'altro caso (double to float, da 64 bit a 32 bit). Il letterale è abbastanza piccolo da essere adatto alla variabile float proprio come int era piccolo @ RealSkeptic –

+0

La risposta è comunque in questa domanda - la risposta migliore non è quella accettata, però. – RealSkeptic

risposta

7

0.3 viene trattato come un doppio, quindi la sua rappresentazione binaria richiede 64 bit e non può inserirsi in un galleggiante colpo possibile perdita di precisione, quindi non è possibile assegnarlo a una variabile mobile senza un cast esplicito.

D'altra parte, se si assegna a una variabile char un valore letterale int all'interno dell'intervallo del tipo di carattere (ad esempio 123), non c'è perdita di dati.

Entrambe le assegnazioni (int a variabile di variabile e doppia a variabile) richiedono un narrowing primitive conversion.

JLS 5.2 dice

Un ambito conversione primitivo può essere utilizzato se il tipo della variabile è byte, short, o char e il valore dell'espressione costante è rappresentabile nel tipo di variabile.

+3

Vorrei aggiungere che '0,3' non può essere rappresentato esattamente in virgola mobile b con * qualsiasi * livello di precisione. –

+1

Un numero intero, non importa quanto piccolo, sarà sempre rappresentato da 32 bit mentre un carattere è rappresentato da 16 bit. Quindi non c'è anche una possibile perdita di precisione? Proprio come in caso di galleggianti e doppi? –

+1

@PiyushSaravagi Vedere la citazione che ho aggiunto dal JLS. Qualsiasi int tra 0 e 2^16-1 può essere assegnato a una variabile char senza alcuna perdita di informazioni, poiché i primi 16 bit dell'int conterranno 0s in modo che possano essere scartati senza perdere alcuna informazione. – Eran

Problemi correlati