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 doubledouble używają tej samej reprezentacji, mają ten sam zakres i dokładność.

Gdy kompilator konwertuje double liczbę zmiennoprzecinkową lub long double zmiennoprzecinkową floatna 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 lub unsigned long longwynik 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 floatwystę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ż

Konwersje przypisań