Sdílet prostřednictvím


Převody z typů s plovoucí desetinnou čárkou

Hodnota s plovoucí desetinnou čárkou převedená na jiný typ s plovoucí desetinnou čárkou neprojde žádnou změnou hodnoty, pokud je původní hodnota reprezentovatelná přesně v typu výsledku. Pokud je původní hodnota číselná, ale není přesně reprezentovatelná, výsledek je buď další větší, nebo další nižší reprezentovatelná hodnota. Viz Omezení pro konstanty s plovoucí desetinou čárkou pro rozsah typů s plovoucí desetinou čárkou.

Hodnota s plovoucí desetinnou čárkou, která je převedena na celočíselný typ, je nejprve zkrácena zrušením jakékoli desetinné hodnoty. Pokud je tato zkrácená hodnota reprezentována v typu výsledku, musí být výsledkem tato hodnota. Pokud není reprezentovatelná, je výsledná hodnota nedefinovaná.

Specifické pro Microsoft

Kompilátory Společnosti Microsoft používají reprezentaci binárního formátu IEEE-754 pro float hodnoty a reprezentaci binárního formátu 64 pro long double a double. Vzhledem k tomu long double , že double a používají stejnou reprezentaci, mají stejný rozsah a přesnost.

Když kompilátor převede číslo s long double plovoucí desetinou čárkou double na floatčíslo , zaokrouhlí výsledek podle ovládacích prvků prostředí s plovoucí desetinou čárkou, které mají výchozí hodnotu "zaokrouhlit na nejbližší, shodné vazby na sudé". Pokud je číselná hodnota příliš vysoká nebo příliš nízká, aby byla reprezentována jako číselná float hodnota, výsledek převodu je kladný nebo záporný nekonečno podle znaménka původní hodnoty a pokud je povolená výjimka přetečení, je vyvolána.

Výsledek převodu na celočíselný typ menší, než long je výsledek převodu hodnoty na longhodnotu a následný převod na typ výsledku.

Pro převod na celočíselné typy alespoň tak velké jako longje převod hodnoty, která je příliš vysoká nebo příliš nízká, aby představovala v typu výsledku, může vrátit některou z následujících hodnot:

  • Výsledkem může být hodnota sentinelu, což je reprezentovatelná hodnota od nuly. U podepsaných typů je to nejnižší reprezentovatelná hodnota (0x800... 0). U nepodepsaných typů je to nejvyšší reprezentovatelná hodnota (0xFF... F).

  • Výsledek může být nasycený, kde se hodnoty příliš vysoké na reprezentaci převedou na nejvyšší reprezentovatelnou hodnotu. Příliš nízké hodnoty pro reprezentaci se převedou na nejnižší reprezentovatelnou hodnotu. Jedna z těchto dvou hodnot se také používá jako hodnota sentinelu.

  • Při převodu na unsigned long nebo unsigned long longmůže být výsledkem převodu hodnoty mimo rozsah jiná hodnota než nejvyšší nebo nejnižší reprezentovatelná hodnota. Ať už je výsledkem sentinel nebo nasycená hodnota, nebo ne, závisí na možnostech kompilátoru a cílové architektuře. Budoucí verze kompilátoru mohou místo toho vrátit nasycenou hodnotu nebo hodnotu sentinelu.

END Microsoft Specific

Následující tabulka shrnuje převody z plovoucích typů.

Tabulka převodů z typů s plovoucí desetinou čárkou

Z Záměr metoda
float char Převést na long, pak převést long na char
float short Převést na long, pak převést long na short
float int Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako int, výsledek není definován.
float long Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako long, výsledek není definován.
float long long Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako long long, výsledek není definován.
float unsigned char Převést na long, pak převést long na unsigned char
float unsigned short Převést na long, pak převést long na unsigned short
float unsigned Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako unsigned, výsledek není definován.
float unsigned long Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako unsigned long, výsledek není definován.
float unsigned long long Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako unsigned long long, výsledek není definován.
float double Představuje jako .double
float long double Představuje jako .long double V MSVC long double a double mají stejnou reprezentaci.
double char Převést na float, pak převést float na char
double short Převést na float, pak převést float na short
double int Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako int, výsledek není definován.
double long Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako long, výsledek není definován.
double unsigned char Převést na long, pak převést long na unsigned char
double unsigned short Převést na long, pak převést long na unsigned short
double unsigned Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako unsigned, výsledek není definován.
double unsigned long Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako unsigned long, výsledek není definován.
double unsigned long long Zkrátit desetinnou čárku. Pokud je výsledek příliš velký, aby byl reprezentován jako unsigned long long, výsledek není definován.
double float Představuje jako .float double Pokud hodnotu nelze přesně reprezentovat, floatdojde ke ztrátě přesnosti.
double long double Hodnota long double je považována za double.

Převody z long double následujícího postupu jako převody z double.

Viz také

Převody přiřazení