所以我有一个const浮点数,范围从0.0到1.0。通过舍入或截断将这个转换为unsigned int的正确方法是什么?
这可以接受吗?
const float f=0.5f;
unsigned int i=static_cast<unsigned int>(f);
答案 0 :(得分:4)
是的,如果您想要截断,并且如果您不关心负数或溢出会发生什么,那么这是完全可以接受的。
如果你想要四舍五入,先打电话给roundf
(或者,如果你想要一个不同的“舍入规则”,那么请写下你自己的代码)。
如果您想处理负数或溢出,您需要在转换前进行检查。
根据标准中的5.2.9,在这种情况下static_cast
被定义为给出与unsigned int i(f)
相同的值。而且我认为大多数风格指南会同意static_cast
是首选的(因为制作明确且明显的演员表通常是件好事。)
更详细:
根据4.9.1:
浮点类型的prvalue可以转换为整数类型的prvalue。转换转发;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。
我不确定const-away究竟是如何在C ++ 14中运行的,但我相信它不是一个限定转换,而是4.1.1中左值到右值转换的一部分:
非函数非数组类型T的glvalue(3.10)可以转换为prvalue ...如果T是非类类型,则prvalue的类型是T的非限定版本。 / p>
因此,f
从左值const float
到右值float
有一个左值到右值的转换,然后是从float
到{{1}的一次浮点积分转换},所以4.0.1是标准转换,所以5.2.9它有效unsigned int
。
答案 1 :(得分:3)
只需将一半添加到圆形:
unsigned int i = static_cast<unsigned int>(f + 0.5);
或者没有什么可以截断 - 你拥有的是好的(假设f >= 0
)
unsigned int i = static_cast<unsigned int>(f);