Freigeben über


Konvertierungen von Gleitkommatypen

Ein Gleitkommawert, der in einen anderen Gleitkommatyp konvertiert wird, wird nicht geändert, wenn der ursprüngliche Wert exakt im Ergebnistyp dargestellt werden kann. Wenn der ursprüngliche Wert numerisch ist, aber nicht exakt dargestellt werden kann, ist das Ergebnis entweder der nächste höhere oder nächste niedrigere darstellbare Wert. Weitere Informationen über den Bereich von Gleitkommatypen erhalten Sie unter Grenzwerte für Gleitkommakonstanten.

Ein Gleitkommawert, der in einen integralen Typ konvertiert wird, wird zunächst abgeschnitten, indem etwaige Bruchwerte verworfen werden. Wenn dieser gekürzte Wert im Ergebnistyp darstellbar ist, muss das Ergebnis dieser Wert sein. Wenn er nicht darstellbar ist, ist der Ergebniswert nicht definiert.

Microsoft-spezifisch

Microsoft-Compiler verwenden die 32-Bit-IEEE-754-Binärdarstellung für float -Werte und die 64-Bit-Binärdarstellung für long double - und double -Werte. Da long double und double dieselbe Darstellung verwenden, weisen sie denselben Bereich und dieselbe Genauigkeit auf.

Wenn der Compiler eine Gleitkommazahl des Typs double oder long double in eine Gleitkommazahl des Typs float konvertiert, wird das Ergebnis gemäß der Umgebungssteuerung für Gleitkommazahlen gerundet (standardmäßig „round to nearest, ties to even“). Ist ein numerischer Wert zu hoch oder zu niedrig, um als numerischer float-Wert dargestellt zu werden, lautet das Konvertierungsergebnis entsprechend dem Vorzeichen des ursprünglichen Werts „positiv unendlich“ oder „negativ unendlich“. Außerdem wird eine Überlaufausnahme ausgelöst, wenn dies möglich ist.

Das Ergebnis einer Konvertierung in einen integralen Typ, der kleiner als long ist, entspricht dem Ergebnis der Konvertierung des Werts in long und der anschließenden Konvertierung in den Ergebnistyp.

Bei der Konvertierung in ganzzahlige Typen, die größer oder gleich long sind, kann eine Konvertierung eines Werts, der zu hoch oder zu niedrig ist, um im Ergebnistyp dargestellt zu werden, jeden der folgenden Werte zurückgeben:

  • Das Ergebnis kann ein Sentinelwert sein, bei dem es sich um den darstellbaren Wert von 0 (null) handelt. Bei signierten Typen ist dies der niedrigste darstellbare Wert (0x800... 0). Bei nicht signierten Typen ist dies der höchste darstellbare Wert (0xFF...F).

  • Das Ergebnis kann gesättigt sein, wobei Werte, die zu hoch sind, um dargestellt zu werden, in den höchsten darstellbaren Wert konvertiert werden. Werte, die zu niedrig sind, um dargestellt zu werden, werden in den niedrigsten darstellbaren Wert konvertiert. Einer dieser beiden Werte wird auch als Sentinelwert verwendet.

  • Bei der Konvertierung in unsigned long oder unsigned long long kann das Ergebnis der Konvertierung eines Werts außerhalb des Bereichs ein anderer Wert als der höchste oder niedrigste darstellbare Wert sein. Ob das Ergebnis ein Sentinelwert oder ein gesättigter Wert ist, hängt von den Compileroptionen und der Zielarchitektur ab. Zukünftige Compilerreleases können stattdessen einen gesättigten Wert oder einen Sentinelwert zurückgeben.

Ende Microsoft-spezifisch

In der folgenden Tabelle werden die Konvertierungen von Gleitkommatypen zusammengefasst.

Tabelle für Konvertierungen von Gleitkommatypen

Von Beschreibung Methode
float char Konvertieren Sie in long, und konvertieren Sie long dann in char.
float short Konvertieren Sie in long, und konvertieren Sie long dann in short.
float int Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als int dargestellt zu werden, wird es nicht definiert.
float long Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als long dargestellt zu werden, wird es nicht definiert.
float long long Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als long long dargestellt zu werden, wird es nicht definiert.
float unsigned char Konvertieren Sie in long, und konvertieren Sie long dann in unsigned char.
float unsigned short Konvertieren Sie in long, und konvertieren Sie long dann in unsigned short.
float unsigned Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als unsigned dargestellt zu werden, wird es nicht definiert.
float unsigned long Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als unsigned long dargestellt zu werden, wird es nicht definiert.
float unsigned long long Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als unsigned long long dargestellt zu werden, wird es nicht definiert.
float double Als double darstellen
float long double Als long double darstellen In MSVC weisen long double und double die gleiche Darstellung auf.
double char Konvertieren Sie in float, und konvertieren Sie float dann in char.
double short Konvertieren Sie in float, und konvertieren Sie float dann in short.
double int Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als int dargestellt zu werden, wird es nicht definiert.
double long Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als long dargestellt zu werden, wird es nicht definiert.
double unsigned char Konvertieren Sie in long, und konvertieren Sie long dann in unsigned char.
double unsigned short Konvertieren Sie in long, und konvertieren Sie long dann in unsigned short.
double unsigned Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als unsigned dargestellt zu werden, wird es nicht definiert.
double unsigned long Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als unsigned long dargestellt zu werden, wird es nicht definiert.
double unsigned long long Beim Dezimaltrennzeichen abschneiden. Wenn das Ergebnis zu groß ist, um als unsigned long long dargestellt zu werden, wird es nicht definiert.
double float Als float darstellen Wenn der Wert double nicht exakt als float dargestellt werden kann, tritt ein Genauigkeitsverlust auf.
double long double Der Wert long double wird als double behandelt.

Bei Konvertierungen von long double wird das gleiche Verfahren wie bei Konvertierungen von double angewendet.

Siehe auch

Zuweisungskonvertierungen