Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何正确地将常量浮点舍入为无符号整数_C++ - Fatal编程技术网

C++ C++;如何正确地将常量浮点舍入为无符号整数

C++ C++;如何正确地将常量浮点舍入为无符号整数,c++,C++,所以我有一个常量浮点,它的范围是0.0到1.0。通过舍入或截断将其转换为无符号整数的正确方法是什么 这是否可以接受 const float f=0.5f; unsigned int i=static_cast<unsigned int>(f); const float f=0.5f; 无符号整数i=静态_转换(f); 只需在四舍五入中添加一半即可: unsigned int i = static_cast<unsigned int>(f + 0.5); 是的,如果您想

所以我有一个常量浮点,它的范围是0.0到1.0。通过舍入或截断将其转换为无符号整数的正确方法是什么

这是否可以接受

const float f=0.5f;
unsigned int i=static_cast<unsigned int>(f);
const float f=0.5f;
无符号整数i=静态_转换(f);

只需在四舍五入中添加一半即可:

unsigned int i = static_cast<unsigned int>(f + 0.5);

是的,如果您想要截断,并且不关心负数或溢出会发生什么,那么这是完全可以接受的

如果要进行舍入,请先调用
roundf
(或者,如果要使用不同于“离零半舍入”的舍入规则,请编写自己的代码)

如果要处理负数或溢出,则需要在转换之前进行检查

根据本标准第5.2.9节的规定,在这种情况下,
static\u cast
的定义是为您提供与
unsigned int i(f)
相同的值。我认为大多数风格指南都会同意首选
static_cast
(因为使cast显式和引人注目通常是一件好事)

更详细地说:

根据4.9.1:

浮点类型的prvalue可以转换为整数类型的prvalue。转换过程;也就是说,小数部分被丢弃。如果目标类型中无法表示截断的值,则行为未定义

我不确定const away在C++14中到底是如何工作的,但我相信这不是限定转换,而是从4.1.1到右值转换的一部分:

非函数、非数组类型T的glvalue(3.10)可以转换为prvalue…如果T是非类类型,则prvalue的类型为T的cv非限定版本


因此,
f
有一个从左值
const float
到右值
float
的左值到右值的转换,然后是一个从
float
unsigned int
的浮点整数转换,所以4.0.1是一个标准转换,所以5.2.9是有效的
static\u cast
/p>,这样就可以对它进行四舍五入了,但我并不一定在乎它是四舍五入还是被截断,我只是好奇使用静态施法是否被认为是“良好实践”?@TriforceOfKirby静态施法是此操作的首选施法。事实上,浮动是常量在这里并不重要。@Neil是的,我认为这不重要,但我认为我最好包括它;为了表明这个值是已知的,溢出或符号的问题不会成为问题。好的,谢谢,因为它是一个常数,只应该在0.0和1.0之间,我不必担心负数或溢出。@TriforceOfKirby:在这种情况下,它总是会转换为0,当然,除非它正好是1.0。是的,我应该提到的是,它被用作一个比例值,乘以后存储在一个无符号整数中。
unsigned int i = static_cast<unsigned int>(f);