-1

今天发现VS2010不支持roundC++项目中的功能。有关该功能的信息已在此处找到。还注意到也没有trunc功能。

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


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

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

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

编辑:我不是在询问 C++11,因为我使用的是 VS2008。

4

2 回答 2

5

它明确定义在

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

1浮点类型的纯右值可以转换为整数类型的纯右值。转换截断;也就是说,小数部分被丢弃。如果截断的值不能在目标类型中表示,则行为未定义。[注意:如果目标类型是bool,请参见 4.12。——尾注]

于 2013-10-13T13:55:55.417 回答
2

这不是未定义的行为。

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

浮点类型的右值可以转换为整数类型的右值。转换截断;也就是说,小数部分被丢弃。如果截断的值不能在目标类型中表示,则行为未定义。[ 注意:如果目标类型是布尔型,请参见 4.12。——尾注]

于 2013-10-13T13:56:25.090 回答