Konwersje z typów zmiennoprzecinkowych
Wartość zmiennoprzecinkowa przekonwertowana na inny typ zmiennoprzecinkowy nie ulega zmianie, jeśli oryginalna wartość jest reprezentowana dokładnie w typie wyniku. Jeśli oryginalna wartość jest liczbowa, ale nie jest reprezentowana dokładnie, wynik jest kolejnym większym lub następnym niższym wartością reprezentującą. Zobacz Limity stałych zmiennoprzecinkowych dla zakresu typów zmiennoprzecinkowych.
Wartość zmiennoprzecinkowa, która jest konwertowana na typ całkowity, jest najpierw obcięta przez odrzucenie dowolnej wartości ułamkowej. Jeśli ta obcięta wartość jest reprezentowana w typie wyniku, wynik musi być tą wartością. Jeśli nie można go przedstawić, wartość wyniku jest niezdefiniowana.
Specyficzne dla firmy Microsoft
Kompilatory firmy Microsoft używają reprezentacji binary32 IEEE-754 dla float
wartości i reprezentacji binarnej64 dla long double
elementów i double
. Ponieważ long double
i double
używają tej samej reprezentacji, mają ten sam zakres i precyzję.
Gdy kompilator konwertuje double
liczbę zmiennoprzecinkową float
lub long double
zmiennoprzecinkową na wartość , zaokrągla wynik zgodnie z kontrolkami środowiska zmiennoprzecinkowego, które domyślnie są "zaokrąglone do najbliższych, wiązania do parzystych". Jeśli wartość liczbowa jest zbyt wysoka lub zbyt niska, aby była reprezentowana jako wartość liczbowafloat
, wynik konwersji jest dodatni lub ujemny nieskończoność zgodnie ze znakiem oryginalnej wartości, a wyjątek przepełnienia jest zgłaszany, jeśli jest włączony.
Wynik konwersji na typ całkowity mniejszy niż long
jest wynikiem konwersji wartości na long
, a następnie konwersji na typ wyniku.
W przypadku konwersji na typy całkowite co najmniej tak duże jak long
, konwersja wartości, która jest zbyt wysoka lub zbyt niska do reprezentowania w typie wyniku, może zwrócić dowolną z następujących wartości:
Wynik może być wartością sentinel, która jest wartością reprezentującą najdalej od zera. W przypadku typów podpisanych jest to najniższa godna reprezentowania wartość (0x800... 0). W przypadku niepodpisanych typów jest to najwyższa godna reprezentowania wartość (0xFF... F).
Wynik może być nasycony, gdzie wartości zbyt wysokie do reprezentowania są konwertowane na najwyższą godną reprezentowania wartość. Wartości zbyt niskie do reprezentowania są konwertowane na najniższą godną reprezentowania wartość. Jedna z tych dwóch wartości jest również używana jako wartość sentinel.
W przypadku konwersji na
unsigned long
lubunsigned long long
wynik konwersji wartości poza zakresem może być wartością inną niż najwyższa lub najniższa godna reprezentowania wartość. Niezależnie od tego, czy wynik jest wartością sentinel, czy nasyconym, czy nie zależy od opcji kompilatora i architektury docelowej. Przyszłe wersje kompilatora mogą zamiast tego zwracać wartość nasyconych lub sentinel.
END Microsoft Specific
W poniższej tabeli podsumowano konwersje z typów zmiennoprzecinkowych.
Tabela konwersji z typów zmiennoprzecinkowych
Źródło | Działanie | Method |
---|---|---|
float |
char |
Przekonwertuj na long , a następnie przekonwertuj long na char |
float |
short |
Przekonwertuj na long , a następnie przekonwertuj long na short |
float |
int |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako int , wynik jest niezdefiniowany. |
float |
long |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako long , wynik jest niezdefiniowany. |
float |
long long |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako long long , wynik jest niezdefiniowany. |
float |
unsigned char |
Przekonwertuj na long , a następnie przekonwertuj long na unsigned char |
float |
unsigned short |
Przekonwertuj na long , a następnie przekonwertuj long na unsigned short |
float |
unsigned |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako unsigned , wynik jest niezdefiniowany. |
float |
unsigned long |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako unsigned long , wynik jest niezdefiniowany. |
float |
unsigned long long |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako unsigned long long , wynik jest niezdefiniowany. |
float |
double |
Reprezentacja jako .double |
float |
long double |
Reprezentacja jako .long double W środowisku MSVC long double i double mają tę samą reprezentację. |
double |
char |
Przekonwertuj na float , a następnie przekonwertuj float na char |
double |
short |
Przekonwertuj na float , a następnie przekonwertuj float na short |
double |
int |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako int , wynik jest niezdefiniowany. |
double |
long |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako long , wynik jest niezdefiniowany. |
double |
unsigned char |
Przekonwertuj na long , a następnie przekonwertuj long na unsigned char |
double |
unsigned short |
Przekonwertuj na long , a następnie przekonwertuj long na unsigned short |
double |
unsigned |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako unsigned , wynik jest niezdefiniowany. |
double |
unsigned long |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako unsigned long , wynik jest niezdefiniowany. |
double |
unsigned long long |
Obcinanie w punkcie dziesiętny. Jeśli wynik jest zbyt duży, aby był reprezentowany jako unsigned long long , wynik jest niezdefiniowany. |
double |
float |
Reprezentacja jako .float double Jeśli wartość nie może być reprezentowana dokładnie jako float , występuje utrata precyzji. |
double |
long double |
Wartość jest traktowana long double jako double . |
Konwersje z long double
tej samej metody co konwersje z double
klasy .