Perché non posso passare un valore elevato come int32?
-
28-10-2019 - |
Domanda
Ho un numero: 94.800.620.800
Il galleggiante è tipo dati a 4 byte. Int32 è anche tipo dati a 4 byte.
float f = 94800620800; // ok
Int32 t = 94800620800; // error
Si prega di spiegare questo problema. Perché ricevo un errore quando uso INT32. Perché posso usare questo numero per il tipo di dati float perché entrambi sono tipi di dati a 4 byte. Grazie.
Soluzione
Perché il numero che stai cercando di assegnare è più grande del più grande valore possibile Per un numero di tipi Int32
, che sembra essere 2.147.483.647. Da notare, il valore massimo per a Single
è 3.402823 × 1038.
Altri suggerimenti
Il valore massimo per INT32 è 2.147.483.647, che è inferiore a 94.800.620.800.
Un galleggiante può assumere un valore nell'intervallo seguente: ± 1,5 × 10-45 a ± 3,4 × 1038
Inoltre, dai un'occhiata a questo domanda - Qual è la differenza tra il tipo di dati galleggianti e interi quando la dimensione è la stessa in Java?. È una domanda Java, ma il concetto è lo stesso e c'è una spiegazione dettagliata della differenza, anche se hanno le stesse dimensioni.
Perché quel numero è troppo grande per un int a 4 byte. Valori scalari come Int32
avere un limite minimo e massimo (che sono -231 e 231 - 1 in questo caso, rispettivamente) e semplicemente non puoi archiviare un valore al di fuori di questo intervallo.
I numeri di punta mobile vengono archiviati in modo completamente diverso, quindi non riceverai errori del compilatore con valori enormi, solo possibili problemi di precisione in seguito, durante il runtime.
A causa di questi tipi rappresentazione interna.
float
Usa qualcosa come io, d ^ n in cui sono la parte integrante, d è la parte decimale e n è l'esponente (ovviamente, questo accade nella base 2).
In questo modo, puoi archiviare numeri più grandi in un float
, ma non sarà accurato come a, diciamo, Int32
Nel conservare numeri integrali. Se provi a convertire
float f = 94800620800;
A un tipo integrale abbastanza grande da archiviare il suo valore, potrebbe non essere lo stesso del 94800620800 iniziale.
I tipi di numeri interi sono rappresentazioni esatte, mentre i numeri dei punti galleggianti sono una combinazione di cifre e esponenti significativi.
Il Pagina wiki a punta galleggiante sta spiegando come funziona.
Forse dovresti leggere il messaggio di errore? ;)
Error Integral constant is too large
Il valore massimo di un int a 32 bit è 2.147.483.647
Il galleggiante d'altra parte funziona perché memorizza una mantissa ed esponente, piuttosto che un solo numero, in modo che possa far fronte a una gamma molto più grande a spese di eventualmente perdere la precisione
prova a stampare il tuo galleggiante e otterrai 94800620000
invece di 94800620800
Man mano che i pezzi inferiori vengono persi
Int32 ha un valore massimo di 2.147.483.647. Il tuo valore è molto più alto.
Date un'occhiata al System.int32.maxValue
Il valore fornito dell'espressione costante non rientra nell'intervallo del tipo di dati int.
L'intervallo di INT32 passa da - 2.147.483.648 a 2.147.483.647. La tua variabile è fuori portata.