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 long
hodnotu a následný převod na typ výsledku.
Pro převod na celočíselné typy alespoň tak velké jako long
je 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
nebounsigned long long
můž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, float dojde 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
.