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 następny większy lub następny niższy reprezentujący wartość. Zobacz Limity stałych zmiennoprzecinkowych dla zakresu typów zmiennoprzecinkowych.
Wartość zmiennoprzecinkowa 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 wyników, wynik musi być tą wartością. Gdy 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ż i long double
double
używają tej samej reprezentacji, mają ten sam zakres i dokładność.
Gdy kompilator konwertuje double
liczbę zmiennoprzecinkową lub long double
zmiennoprzecinkową float
na wartość , zaokrągla wynik zgodnie z kontrolkami środowiska zmiennoprzecinkowego, które domyślnie są domyślnie "zaokrąglone do najbliższego, a nawet. Jeśli wartość liczbowa jest zbyt wysoka lub zbyt mała, aby była reprezentowana jako wartość liczbowa float
, wynik konwersji jest dodatnią lub ujemną nieskończonością zgodnie ze znakiem oryginalnej wartości i zgłaszany jest wyjątek przepełnienia, 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:
Wynikiem może być wartość sentinel, która jest wartością reprezentującą najdalej od zera. W przypadku typów podpisanych jest to najniższa reprezentowana wartość (0x800... 0). W przypadku typów niepodpisanych jest to najwyższa reprezentowana wartość (0xFF... F).
Wynik może być nasycony, gdzie wartości zbyt wysokie do reprezentowania są konwertowane na największą reprezentowaną wartość. Wartości zbyt niskie do reprezentowania są konwertowane na najniższą reprezentowaną 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 wartość reprezentująca. Niezależnie od tego, czy wynik jest wartością sentinel, czy nasyconą, czy nie zależy od opcji kompilatora i architektury docelowej. Przyszłe wersje kompilatora mogą zamiast tego zwracać wartość nasyconą lub sentinel.
KONIEC specyficzny dla firmy Microsoft
Poniższa tabela zawiera podsumowanie konwersji z typów zmiennoprzecinkowych.
Tabela konwersji z typów zmiennoprzecinkowych
Źródło | Działanie | Metoda |
---|---|---|
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 long double MSVC i double mają taką 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 tak, jak float występuje utrata dokładności. |
double |
long double |
Wartość jest traktowana long double jako double . |
Konwersje z metody są zgodne z long double
tą samą metodą co konwersje z klasy double
.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla