Kurz gesagt, nein. Wenn %code% , dann du kenne das Format von %code% , mehr oder weniger: du musst noch Bestimmen Sie die Byte-Reihenfolge. Für alles andere sind alle Wetten deaktiviert. (Die anderen Formate, die ich kenne und die noch immer benutzt werden, sind nicht gleich Basis 2: IBM Mainframes verwenden zum Beispiel die Basis 16) "Standard" -Anordnung eines IEC-Gleitkommazeichens hat das Vorzeichen an das höherwertige Bit, dann der Exponent und die Mantisse auf der Bits niedriger Ordnung; wenn Sie es als erfolgreich ansehen können %code% , zum Beispiel (via %code% , %code% oder %code% - 'memcpy funktioniert garantiert, ist aber weniger effizienter als die anderen beiden), dann:
für %code% :
%Vor%für 'float:
%Vor%In Bezug auf %code% ist es schlimmer, weil anders Compiler behandeln es anders, sogar auf der gleichen Maschine. Nominell ist es zehn Bytes, aber aus Gründen der Ausrichtung kann es in Tatsache sein 12 oder 16. Oder nur ein Synonym für %code% . Wenn es ist Mehr als 10 Bytes, denke ich kannst du darauf zählen, dass es gepackt wird in die ersten 10 Bytes, so dass %code% die Adresse des 10-Byte-Wertes. Aber im Allgemeinen würde ich vermeiden %code% .
Gibt es eine C ++ - Standardkonforme Methode zum Bestimmen der Struktur von 'float', 'double' und 'long double' zur Kompilierungszeit (oder Laufzeit als Alternative)?
Wenn ich %code% und %code% annahm, vermute ich, dass dies durch die folgenden Regeln möglich ist:
mit den folgenden vagen Formulierungen:
außer ich weiß
Hintergrund : Ich versuche zwei Probleme portabel zu lösen:
Ich würde sagen, dass der einzige tragbare Weg ist, die Nummer als String zu speichern. Dies beruht nicht auf "Bitmuster interpretieren"
Auch wenn Sie wissen, wie viele Bits etwas ist, bedeutet das nicht, dass es die gleiche Repräsentation hat - der Exponent ist nullbasiert oder voreingenommen. Gibt es eine unsichtbare 1 an der Vorderseite der Mantisse? Das Gleiche gilt für alle anderen Teile der Nummer. Und es wird noch schlimmer für BCD-kodierte oder "hexadezimale" Floats - diese sind in einigen Architekturen verfügbar ...
Wenn Sie sich Sorgen um nicht initialisierte Bits in einer Struktur (Klasse, Array usw.) machen, verwenden Sie memset, um die gesamte Struktur auf Null [oder einen anderen bekannten Wert] zu setzen.
Für die Nachwelt habe ich das getan.
Um meine IEEE-754-Signalisierungs-NaN-Werte zu generieren und zu testen, verwende ich dieses Muster für 'float' und 'double'.
%Vor%Für 'long double' verwende ich die 'doppelten' Funktionen beim Casting. Insbesondere erzeuge ich den "doppelten" Wert und wandle ihn vor der Rückgabe in "long double" um, und ich teste das "long double", indem ich es "verdopple" und dann diesen Wert teste. Meine Idee ist, dass das "Long Double" -Format variieren kann, wenn man ein "Double" in ein "Long Double" umwandelt, sollte es später konsistent sein (dh keine Information verlieren) / p>