Der obige Code definiert effektiv eine Gleitkommakonstante mit einigen sehr spezifischen Bytes.
Jedes float
wird mit einer Menge von Bytes dargestellt, aber wenn Sie float
Konstanten definieren, müssen Sie die Dezimalzahl verwenden und keine Konstante mit dem Wert say 0xFFFFFFFF
definieren (weiß nicht) wenn diese Konstante eine legale float
-Nummer ist).
Der obige Code umgeht diese Einschränkung - er setzt zunächst ein Byte-Array innerhalb der Union und "greift" dann auf dasselbe Byte-Array zu, als wäre es eine float
-Nummer. Dies ist übrigens illegal - nur das vorher gesetzte Gewerkschaftsmitglied kann legal angesprochen werden, aber es könnte bei dieser spezifischen Implementierung funktionieren.
Erzeugt eine Variable INFINITY_HACK vom Typ MSVC_EVIL_FLOAT_HACK. Es setzt das Byte-Array auf Werte der jeweiligen Hex-Werte. Es konvertiert dann diese Bytes in eine Fließkommazahl (union erlaubt es nur, einen der zugrundeliegenden Werte zu verwenden, indem es referenziert. Value konvertiert die Daten, auf die INIFITY_HACK zeigt, float), indem es dem IEEE-754 Fließkomma-Standard (beachten Sie, dass die Bytes in umgekehrter Reihenfolge genommen werden) für binäre- & gt; float-Konvertierung.
Es gibt einen netten kleinen Rechner, der es erklären kann, wenn Sie nicht wissen, wie es funktioniert: Ссылка (Wenn Sie 7F800000 eingeben, erhalten Sie Infinity, aber geben Sie 4048F5C2 ein ( Sie werden in die Nähe von 3.14 kommen) Dieser Rechner wird dezimal- & gt; hex.
Es ist eine Möglichkeit, den von einer float-Variablen belegten Speicher auf 0x7f800000 zu initialisieren. Wie @Jim sagt, ist dies + unendlich im Float.
Der Code entspricht in etwa:
%Vor%Zunächst definiert der ursprüngliche Code eine Union, die es Ihnen ermöglicht, vier Byte Speicher entweder als ein Array von vier Bytes oder als ein einzelnes Float (von dem wir annehmen, dass es ebenfalls vier Bytes belegt) zu bearbeiten:
%Vor% Dann weist es eine Instanz der Union namens INFINITY_HACK
zu und setzt die Werte seines Arrays Bytes
auf die angegebenen Hex-Werte.:
Dadurch wird das float-Wertfeld initialisiert, da es auch den gleichen Speicher belegt wie das Byte-Array.
Schließlich definiert es eine Pro-Prozessor-Konstante namens INFINITY
als Float-Wert.
Tags und Links c++