konvertiert int Bits in float
%Vor%Ich bin neu in der C-Programmiersprache, und ich würde gerne eine Frage stellen.
Integer ich hier ist Gießen zu float dann f (irgendwie) stellt erfolgreich 5.0:
%Vor%Allerdings, wenn wir diesen Ansatz versuchen:
%Vor%f würde NICHT 5.0 bekommen, da es die in i gespeicherten Bits auf "float's way" interpretiert. Welche Magie macht der Compiler im ersten Fall eigentlich? Es scheint eine ziemlich anstrengende Arbeit zu sein ... Kann jemand das spezifizieren? Danke.
Es ist ein mühsamer Job, aber jede CPU mit Floating-Point-Unterstützung wird eine entsprechende Anweisung bereitstellen.
Wenn Sie ein Zweierkomplement int
in IEEE-Float-Format für sich selbst konvertieren müssten, würden Sie:
n
-Bits von int (beginnend mit dem Bit nach das erste Zeichen ohne Vorzeichen) in den manificand des float. n
sind jedoch viele Bits von significand, die es in einem float
gibt (23 für einen 32-Bit Float mit einfacher Genauigkeit). Wenn im int
noch Bits übrig sind (dh wenn es größer als 2 24 ist) und das nächste Bit nach dem, für das Sie Platz haben, 1
ist, dürfen Sie oder dürfen nicht aufrunden abhängig vom IEEErundungsmodus im Betrieb. int
in float
. Wenn Sie sich die Baugruppe ansehen
%Vor%fild ist was macht die Magie
Ich bin neu in der C-Programmiersprache, und ich würde gerne eine Frage stellen.
Integer ich hier ist Gießen zu float dann f (irgendwie) stellt erfolgreich 5.0:
%Vor%Allerdings, wenn wir diesen Ansatz versuchen:
%Vor%f würde NICHT 5.0 bekommen, da es die in i gespeicherten Bits auf "float's way" interpretiert. Welche Magie macht der Compiler im ersten Fall eigentlich? Es scheint eine ziemlich anstrengende Arbeit zu sein ... Kann jemand das spezifizieren? Danke.
Auf den IA32-Systemen würde der Compiler Folgendes generieren: -
%Vor%konvertiert int Bits in float
%Vor%Wenn Sie sich die Baugruppe ansehen
%Vor%fild ist was macht die Magie
Es ist ein mühsamer Job, aber jede CPU mit Floating-Point-Unterstützung wird eine entsprechende Anweisung bereitstellen.
Wenn Sie ein Zweierkomplement %code% in IEEE-Float-Format für sich selbst konvertieren müssten, würden Sie:
Die Magie hängt von Ihrer Plattform ab.
Eine Möglichkeit besteht darin, dass Ihre CPU eine spezielle Anweisung zum Kopieren von Fließkommazahlen in ganzzahlige Register hat.
Natürlich muss jemand diese CPUs entwerfen, also ist dies nicht wirklich eine Erklärung für den Algorithmus.
Eine Plattform verwendet möglicherweise ein Fließkommaformat, das so aussieht (tatsächlich ist dies ein Festkommaformat, um es zu verdeutlichen):
%Vor%wobei %code% das Vorzeichen ist, die %code% s der Teil vor dem Punkt sind, die %code% s der Teil nach dem Punkt sind, z. (Punkt ist virtuell und nur für die Präsentation)
%Vor%In diesem Fall ist die Konvertierung fast trivial und kann mit Bitshifting implementiert werden:
%Vor%Und wie in diesem Beispiel verwenden Commodity-C ++ - Implementierungen eine Fließkommadarstellung, die oft als IEEE Fließkomma bezeichnet wird, siehe auch IEEE 754-1985 . Diese sind komplizierter als Festkommazahlen, da sie wirklich eine einfache Formel der Form _s * m n bezeichnen, jedoch haben sie eine gut definierte Interpretation und Sie können Entfalte sie zu etwas, das besser geeignet ist.
In fast allen modernen Systemen ist die Spezifikation für Fließkomma-Arithmetik der IEEE754-Standard. Dies zeigt alles vom Layout im Speicher bis hin zur Ausbreitung und Abrundung. Es ist ein großes Gebiet und etwas, das Sie ziemlich oft ausführlich in der wissenschaftlichen und technischen Programmierung berücksichtigen müssen.
Nun, ich habe gerade den fraglichen Code unter VC ++ kompiliert und die Disassemblierung betrachtet:
%Vor%Die Magie hängt von Ihrer Plattform ab.
Eine Möglichkeit besteht darin, dass Ihre CPU eine spezielle Anweisung zum Kopieren von Fließkommazahlen in ganzzahlige Register hat.
Natürlich muss jemand diese CPUs entwerfen, also ist dies nicht wirklich eine Erklärung für den Algorithmus.
Eine Plattform verwendet möglicherweise ein Fließkommaformat, das so aussieht (tatsächlich ist dies ein Festkommaformat, um es zu verdeutlichen):
%Vor% wobei s
das Vorzeichen ist, die I
s der Teil vor dem Punkt sind, die F
s der Teil nach dem Punkt sind, z. (Punkt ist virtuell und nur für die Präsentation)
In diesem Fall ist die Konvertierung fast trivial und kann mit Bitshifting implementiert werden:
%Vor%Und wie in diesem Beispiel verwenden Commodity-C ++ - Implementierungen eine Fließkommadarstellung, die oft als IEEE Fließkomma bezeichnet wird, siehe auch IEEE 754-1985 . Diese sind komplizierter als Festkommazahlen, da sie wirklich eine einfache Formel der Form _s * m n bezeichnen, jedoch haben sie eine gut definierte Interpretation und Sie können Entfalte sie zu etwas, das besser geeignet ist.
In fast allen modernen Systemen ist die Spezifikation für Fließkomma-Arithmetik der IEEE754-Standard. Dies zeigt alles vom Layout im Speicher bis hin zur Ausbreitung und Abrundung. Es ist ein großes Gebiet und etwas, das Sie ziemlich oft ausführlich in der wissenschaftlichen und technischen Programmierung berücksichtigen müssen.
Nun, ich habe gerade den fraglichen Code unter VC ++ kompiliert und die Disassemblierung betrachtet:
%Vor%Tags und Links c c++ type-conversion casting