假设我有两种算术类型,一个整数I
,一个浮点数,F
.我还假设std::numeric_limits<I>::max()
小于std::numeric_limits<F>::max()
.
现在,假设我有一个正整数值i
.因为可表示的范围F
大于I
,F(i)
应始终定义行为.
但是,如果我有一个浮点值f
,那么f == F(i)
,是否I(f)
定义明确?换句话说,I(F(i))
总是定义行为?
C++ 14标准的相关部分:
4.9浮动积分转换 [conv.fpint]
- 可以将浮点类型的prvalue转换为整数类型的prvalue.转换截断; 也就是说,丢弃小数部分.如果截断的值无法在目标类型中表示,则行为未定义.[ 注意:如果目的地类型是
bool
,请参见4.12.- 结束说明 ]- 可以将整数类型或无范围枚举类型的prvalue转换为浮点类型的prvalue.如果可能,结果是准确的.如果要转换的值在可以表示的值范围内,但该值无法准确表示,则它是实现定义的下一个较低或较高可表示值的选择.[ 注意:如果积分值不能完全表示为浮动类型的值,则会发生精度损失.- 结束注释 ]如果转换的值超出了可以表示的值范围,则行为未定义.如果源类型为
bool
,则将值false
转换为零,并将值true
转换为1.