Всякий раз, когда компилятор должен использовать значение типа в контексте, где ожидается другой тип, выполняется неявное преобразование.
Правила для неявных преобразований многочисленны , нов разделе Преобразования с плавающей запятой есть следующий параграф:
Значение типа с плавающей запятой может быть преобразовано в значение любого целочисленного типа.Дробная часть усекается, то есть дробная часть отбрасывается.Если значение не может вписаться в тип назначения, поведение не определено (даже если тип назначения не имеет знака, арифметика по модулю не применяется).Если типом назначения является bool, это логическое преобразование (см. Ниже).
Таким образом, вы можете безопасно назначать тип с плавающей запятой (например, float
или double
) целому числу.При условии, что значение может соответствовать, десятичная часть будет усечена.Это подразумевает потерю данных и может быть источником ошибок или может быть сделано намеренно в определенных приложениях.Обратите внимание, что типы с плавающей запятой имеют больший диапазон, чем int32_t
, и если значение не может быть сохранено, это неопределенное поведение в соответствии со стандартом.
С другой стороны, Bools может быть безопасно назначенцелочисленные типы при любых обстоятельствах:
Если тип источника - bool, значение false преобразуется в ноль, а значение true преобразуется в значение один из типа назначения (обратите внимание, что если тип назначенияis int, это целочисленное продвижение, а не целочисленное преобразование).