今天发现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。
答案 0 :(得分:5)
在
中明确定义4.9浮动积分转换[conv.fpint]
1 浮点类型的prvalue可以转换为整数类型的prvalue。转换转发;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。 [注意:如果目的地类型为
bool
,请参阅4.12。 - 结束记录]
答案 1 :(得分:2)
这不是未定义的行为。
C ++11§4.9浮动积分转换[conv.fpint]
浮点类型的右值可以转换为整数类型的右值。转换截断;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。 [注意:如果目的地类型是bool,请参阅4.12。 - 后注]