将浮点数转换为整数定义的行为

时间:2013-10-13 13:52:54

标签: c++ floating-point undefined-behavior

今天发现VS2010在C ++项目中不支持round函数。有关该功能的信息已找到here。还注意到还没有trunc函数。

所以尝试了一些东西并注意到一些可能有助于这种情况的行为。


float a = 2.999;
int b = (int)a;   //gives 2

float a = -2.999;
int b = (int)a;   //gives -2

这可以作为截断,所以我可以使用它,但是我不想使用导致未定义行为的代码。所以想问一下这是定义的还是未定义的行为。

编辑:因为我正在使用VS2008,所以我不会问C ++ 11。

2 个答案:

答案 0 :(得分:5)

中明确定义
  

4.9浮动积分转换[conv.fpint]

     

1 浮点类型的prvalue可以转换为整数类型的prvalue。转换转发;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。 [注意:如果目的地类型为bool,请参阅4.12。 - 结束记录]

答案 1 :(得分:2)

这不是未定义的行为。

  

C ++11§4.9浮动积分转换[conv.fpint]

     

浮点类型的右值可以转换为整数类型的右值。转换截断;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。 [注意:如果目的地类型是bool,请参阅4.12。 - 后注]