2147483648,0 è in realtà 2 , mentre il valore massimo per un int
è 2 -1. Quindi, quel valore in virgola mobile è letteralmente un valore troppo alto per adattarsi.
Il motivo per cui verrà troncato al valore int più elevato è descritto come in the language specification come conversione di restringimento.
Nella prima fase, il numero in virgola mobile è convertita in un lungo, se T è lunga, oa un int, se T è byte, short, char, o int, come segue:
Se il numero in virgola mobile è NaN (§4.2.3), il risultato della prima fase della conversione è un int long 0.
Altrimenti, se il galleggiante il punto-punto non è un infinito, il punto fluttuante il valore viene arrotondato a un valore intero V, arrotondando a verso zero utilizzando la modalità round-to-zero IEEE 754 (§4.2.3). Poi ci sono due casi:
Se T è lunga, e questo valore intero può essere rappresentato come un lungo, allora il risultato della prima fase è la lunga valore V.
Altrimenti, se questo valore intero può essere rappresentato come un int, allora il risultato della prima fase è il valore int V.
la parte rilevante qui è che il valore sarà rotondo verso lo zero. Fino a quando il valore a virgola mobile (o lungo) è superiore a Integer.MAX_VALUE
, un cast a int
genererà il valore più alto. Lo stesso vale per un valore inferiore a Integer.MIN_VALUE
.
Qualcosa di curioso accade se si utilizza (int)-214783649L
; diventerà improvvisamente 214783647! Perché ciò accada è anche spiegato nel JLS, sottolineatura mia:
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 utilizzato per rappresentare il tipo T. Oltre a una possibile perdita di informazioni sulla grandezza del valore numerico, ciò può causare la differenza del segno del valore risultante dal segno del valore di input.
La lunga rappresentazione di tale valore binario con un tubo che denota il cut-off 32 bit, si presenta come segue:
1111 1111 1111 1111 1111 1111 1111 1111 | 0111 1111 1111 1111 1111 1111 1111 1111
Quando una conversione avviene, i primi 32 bit sono scartati, lasciando tu con il massimo possibile int
.
L'inverso è vero con un positivo lungo - i 32 bit più alti contengono tutti gli 1 che vengono scartati in una conversione.
La struttura integrale è basso, con pipa denota il segno 32 bit:
1111 1111 1111 1111 1111 1111 1111 1111 | 1000 0000 0000 0000 0000 0000 0000 0000
Non è che in realtà un tipo di doppio? Per utilizzare float è necessario definire il numero 2147483648.0f. – juunas