Sono solo curioso di sapere cosa succede dietro la scena per convertire un double in int, ad esempio int (5666.1)? Sarà più costoso di un statico_cast di una classe figlia rispetto a un genitore? Dal momento che la rappresentazione di int e double sono fondamentalmente differenti, ci saranno dei temporanei creati durante il processo e anche costosi.Conversione doppia a int dietro la scena?
risposta
Qualsiasi CPU con virgola mobile nativa avrà un'istruzione per convertire i dati in virgola mobile in numeri interi. Questa operazione può richiedere da alcuni cicli a molti. Di solito ci sono registri CPU separati per FP e interi, quindi è necessario spostare successivamente il numero intero in un registro intero prima di poterlo usare. Potrebbe trattarsi di un'altra operazione, possibilmente costosa. Vedere il manuale del processore.
PowerPC in particolare non include un'istruzione per spostare un numero intero in un registro FP in un registro intero. Ci deve essere un negozio da FP alla memoria e caricare in numero intero. Si potrebbe quindi dire che viene creata una variabile temporanea.
Nel caso di nessun supporto FP hardware, il numero deve essere decodificato. formato IEEE FP è:
sign | exponent + bias | mantissa
Per convertire, è necessario fare qualcosa di simile
// Single-precision format values:
int const mantissa_bits = 23; // 52 for double.
int const exponent_bits = 8; // 11 for double.
int const exponent_bias = 127; // 1023 for double.
std::int32_t ieee;
std::memcpy(& ieee, & float_value, sizeof (std::int32_t));
std::int32_t mantissa = ieee & (1 << mantissa_bits)-1 | 1 << mantissa_bits;
int exponent = (ieee >> mantissa_bits & (1 << exponent_bits)-1)
- (exponent_bias + mantissa_bits);
if (exponent <= -32) {
mantissa = 0;
} else if (exponent < 0) {
mantissa >>= - exponent;
} else if (exponent + mantissa_bits + 1 >= 32) {
overflow();
} else {
mantissa <<= exponent;
}
if (ieee < 0) mantissa = - mantissa;
return mantissa;
cioè un paio di operazioni di bit di disimballaggio e un cambiamento.
C'è invariabilmente un'istruzione FPU dedicata che fa il lavoro, cvttsd2si se il generatore di codice usa il set di istruzioni Intel SSE2. È veloce, ma non veloce come un cast statico. Di solito non richiede alcun codice.
Il file static_cast dipende dalla generazione del codice C++ del compilatore, ma generalmente non ha costi di runtime, poiché la modifica del puntatore viene calcolata in fase di compilazione in base alle informazioni presunte nel cast.
Quando converte un double in int, su un sistema x86 il compilatore genererà un'istruzione FIST (Floating Point/Integer Conversion) e la FPU eseguirà la conversione. Questa conversione può essere implementata nel software, ed è fatta in questo modo su determinati hardware, o se il programma lo richiede. La libreria GNU MPFR è in grado di eseguire conversioni doppie a int e eseguirà la stessa conversione su tutto l'hardware.
- 1. Conversione da doppia a int implicita in mingw32
- 2. Arrotonda una doppia a int
- 3. Conversione Int a intero
- 4. Convertire doppia a Int, arrotondato per difetto
- 5. Conversione Int a raddoppiare nei Swift
- 6. Conversione da IO Int a Int
- 7. Conversione veloce a conversione int (troncato)
- 8. lista <int> conversione a int []
- 9. conversione da int ** a const int **
- 10. Conversione da GHC.Int.Int64 a Int
- 11. Conversione da IntWritatble a int
- 12. Conversione Json.Net JValue a int
- 13. Qual è (doppia (^) (int)) foofoo
- 14. Conversione senza firma lunga lunga a doppia in C
- 15. conversione stringa doppia e locale
- 16. doppia intesa per int64_t conversione
- 17. stringa in notazione scientifica C++ a doppia conversione
- 18. Ingresso JSF non riuscito a Errore di doppia conversione
- 19. conversione da decimale a int in C#
- 20. conversione da Android int a esadecimale
- 21. java.lang.NumberFormatException la conversione di una stringa esadecimale a int
- 22. Problema durante la conversione da int a float
- 23. Conversione da stringa a int utilizzando la funzione toInt
- 24. Conversione implicita Java di int a byte
- 25. Conversione colonna mysql da INT a TIMESTAMP
- 26. Conversione da modificabile a int in Android
- 27. Char a int conversione in C
- 28. Conversione da byte a int in java
- 29. conversione implicita float/int
- 30. Conversione tipo INT
Per un x86 moderno, il compilatore può/genererà un'istruzione SSE2, non una x87. – MSalters
@MSalters: dipende; alcuni compilatori "moderni" codegen ancora alla FPU x87 di default, ma sì, molti compilatori emetteranno 'cvttsd2si'. –
Sì, su x86-32 non si può semplicemente presumere che esista 'cvttsd2si'. Ma ci sono compilatori che usano x86 ins deprecato per x86-64? – MSalters