2016-07-01 12 views
-1

Produzieren diese Zeilen den gleichen kompilierten Code?Werden Literale zum Zeitpunkt der Kompilierung typisiert?

double one = 1.0; 
double one = 1.f; 
double one = 1; 

Oder diese drei?

float one = 1.0; 
float one = 1.f; 
float one = 1; 

bearbeiten

Es sei angenommen, dass die Werte auf der rechten Seite kann als 32-Bit-Float

+2

Ja zu beiden. Diese Typumwandlungen finden zur Kompilierzeit statt. – T33C

+2

Ja, sie sind ... – mvidelgauz

+3

Im Fall von Wert "1" werden sie sehr wahrscheinlich, aber im Allgemeinen kann dies Plattform/Compiler abhängig sein. Bei einem doppelten Wert (mit der vollen doppelten Genauigkeit) sollte die Zeile, die mit "f" endet, abweichen (nicht mit voller doppelter Genauigkeit, Abschneiden/Runden auf Float-Genauigkeit). – Ped7g

Antwort

7

Sie dürfen nicht zur Kompilierzeit konvertiert werden, es sei denn, der Compiler kann nachweisen, dass die Konvertierung zur Kompilierungszeit der Konvertierung zur Laufzeit entspricht. Wenn der Compiler dies beweisen kann, und für viele Typen ist es einfach, führen die meisten Compiler die Konvertierung zur Kompilierungszeit durch.

Aber ein Beispiel, das Sie geben, ist eine Umwandlung von einem Literal vom Typ double zu Typ float. Das wird schwierig. Für Compiler, die Floating-Point-Statusflags unterstützen (die C-Compiler unterstützen müssen, wenn das Pragma FENV_ACCESS verwendet wird, obwohl weder gcc noch clang dieses Pragma implementieren), hat eine solche Konvertierung möglicherweise den Nebeneffekt, eine "ungenaue" Ausnahme auszulösen Die Umwandlung von double zu float würde die Genauigkeit verlieren. In Ihrem Fall wäre die Präzision nicht verloren, sondern z. float f = 1.1;, wäre es fast sicher. Wenn float f = 1.1; und float f = 1.1f; ein sichtbar unterschiedliches Verhalten haben, kann ein Compiler nicht ineinander übergehen.

2

In der Praxis gespeichert werden, würde ich überrascht, wenn sie es nicht taten . Die Anweisungen sind sehr einfach und können zur Kompilierungszeit trivial aufgelöst werden.

Aber streng genommen können und sollten Sie sich nicht darauf verlassen. Semantisch spielen hier Konvertierungen eine Rolle, daher sind die Ergebnisse möglicherweise nicht das, was Sie erwarten. Wenn dein Code davon abhängt, ist die Wahrscheinlichkeit groß, dass du sowieso etwas Seltsames tust.

Verwandte Themen