Udostępnij za pośrednictwem


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ą floatlub 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 lub unsigned long longwynik 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 doubleklasy .

Zobacz też

Konwersje przydziałów