Ich bin nur neugierig zu wissen, was hinter der Szene passiert, um ein Double in int zu konvertieren, sagen int (5666.1)? Wird das teurer als ein static_cast einer Kindklasse zum Elternteil? Da die Darstellung von int und double grundlegend anders ist, werden während des Prozesses auch Provisorien erstellt und teuer.Double to Int Konvertierung hinter der Szene?
Antwort
Jede CPU mit nativem Fließkommawert wird eine Instruktion haben, um Fließkommawerte in ganzzahlige Daten umzuwandeln. Dieser Vorgang kann von einigen Zyklen zu vielen dauern. Normalerweise gibt es separate CPU-Register für FP und Integer, Sie müssen also die ganze Zahl später in ein Integer-Register verschieben, bevor Sie sie verwenden können. Das könnte eine andere Operation sein, möglicherweise teuer. Siehe Ihr Prozessorhandbuch.
PowerPC enthält insbesondere keine Anweisung zum Verschieben einer Ganzzahl in einem FP-Register in ein Integer-Register. Es muss einen Speicher von FP zu Speicher geben und auf Integer laden. Sie können also sagen, dass eine temporäre Variable erstellt wurde.
Wenn keine Hardware-FP-Unterstützung vorhanden ist, muss die Nummer decodiert werden. IEEE FP-Format ist:
sign | exponent + bias | mantissa
zu konvertieren, Sie so etwas wie
// 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;
das heißt, ein paar Bit Auspacken Anweisungen und eine Verschiebung zu tun haben.
Es gibt immer einen dedizierten FPU-Befehl, der den Job erledigt, cvttsd2si, wenn der Codegenerator den Intel SSE2-Befehlssatz verwendet. Das ist schnell, aber nicht so schnell wie eine statische Besetzung. Das erfordert normalerweise keinen Code.
Der Befehl static_cast ist abhängig von der C++ - Codegenerierung des Compilers, hat jedoch im Allgemeinen keine Laufzeitkosten, da die Zeigeränderung zur Kompilierzeit basierend auf den angenommenen Informationen in der Besetzung berechnet wird.
Wenn Sie ein Double in int konvertieren, generiert der Compiler auf einem x86-System einen FIST (Floating-Point/Integer Conversion) Befehl, und die FPU wird die Konvertierung durchführen. Diese Konvertierung kann in Software implementiert werden und erfolgt auf diese Weise auf bestimmter Hardware oder wenn das Programm dies erfordert. Die GNU MPFR-Bibliothek kann Double-to-Int-Konvertierungen durchführen und führt dieselbe Konvertierung auf der gesamten Hardware durch.
- 1. konvertieren double to int
- 2. Java Double to String Konvertierung ohne Formatierung
- 3. Ungültige Double "" bei String zu Double to String Konvertierung
- 4. INotifyPropertyChanged: Was passiert hinter der Szene?
- 5. Float to Double-Konvertierung - Beste Behauptung in einem Unit-Test?
- 6. Wie erfolgt die Fließkommaumwandlung tatsächlich in C++ (double to float oder float to double)
- 7. Umwandlung int float/double
- 8. Convert double to uint8_t *
- 9. RDD to LabeledPoint Konvertierung
- 10. MojoShader: HLSL to GLSL Konvertierung
- 11. C++ int String-Konvertierung
- 12. Int konvertieren in Swift Double
- 13. Linq to XML -Dictionary Konvertierung
- 14. Android signed int zu unsigned Int-Konvertierung
- 15. wav-to-midi Konvertierung
- 16. float/int implizite Konvertierung
- 17. Was ist der Unterschied zwischen double a = a + int b und int a + = double b?
- 18. Kein passender Konstruktor für Farbe gefunden (int, int, int, double)
- 19. Warum gibt int = int * double einen Fehler und int * = double nicht (in Java)?
- 20. #define to double - anderer Wert?
- 21. casting double to signed vs unsigned integer
- 22. Int-Konvertierung - gibt mir seltsame Zahlen
- 23. implizite Konvertierung von Int Shared_ptr
- 24. Was (double (^) (int)) ist foofoo
- 25. Java ermöglicht die implizite Konvertierung von int in float. Warum?
- 26. Hinter den Kulissen von Visual Basic-Casting - Konvertierung von String zu Typ "Double" ist nicht gültig
- 27. PDF to JPG lokale Konvertierung
- 28. Swift: CInt zu Int-Konvertierung?
- 29. Fehler Debugging - Konvertierung von String Double
- 30. Lua string to int
Für ein modernes x86 kann/wird der Compiler einen SSE2-Befehl erzeugen, nicht einen x87. – MSalters
@MSalters: Hängt davon ab; einige "moderne" Compiler kodieren immer noch standardmäßig die x87 FPU, aber ja, viele Compiler werden 'cvttsd2si' ausgeben. –
Ja, auf x86-32 kann man nicht einfach davon ausgehen, dass "cvtstsd2si" existiert. Gibt es Compiler, die die veralteten x87 ins für x86-64 verwenden? – MSalters