Допустим, у меня есть следующий фрагмент кода, который пытается «понижать» двойное значение до uint8_t:
uint8_t downcast(uint8_t *down1, uint8_t *down2)
{
//the usual nullptr checks
double fval = 100.0; //fits the uint8_t domain range
*down1 = (uint8_t)fval; //should work...
fval = 1000.0; //does not fit uint8_t domain range
*down2 = (uint8_t)fval; //will this work??
}
Я видел несколько сообщений, в которых предлагалось выполнить такого рода «квантование», но я не уверен, что это правильно. Кажется, я читал, что двойная переменная, значение которой превышает выходной домен, приведет к неопределенному поведению приведения (либо C, либо static_cast<uint8_t>(fval)
).
Мысли?
Поведение второго приведения не определено.
C17 §6.3.1.4 ¶1 Когда конечное значение действительного плавающего типа преобразуется в целочисленный тип, отличный от
_Bool
, дробная часть отбрасывается (т. е. значение усекается до нуля). Если значение целой части не может быть представлено целочисленным типом, поведение не определено.
Спасибо! Я нашел это ТАК-объяснение этой части стандарта. Приведенные здесь примеры хорошо объясняют мою ситуацию, которая похожа. stackoverflow.com/questions/75578931/…