有人能解释一下float
到uint32_t
选角的工作原理吗?这是一个有效的转换吗?
下面代码中第一行的输出对我来说是有意义的,但其余的我自己都搞不清楚。
cout<<uint8_t(256+33)<<'n';
cout<<uint8_t(float(256+33))<<'n';
cout<<int(uint8_t(float(256+33)))<<'n';
cout<<int(uint8_t(float(256+3)))<<'n';
cout<<int(uint8_t(float(256+20)))<<'n';
输出
!
�
255
255
255
uint8_t(256+33)
是int到unsigned char,它给出了!
,这正是我所期望的。然而,float
到uint8_t
根本不起作用。当我尝试将输出强制转换为int时,它会给我一个常量255
。
我有一个vector<float>
,想把它转换成vector<uint8_t>
,它将被传递到一个函数中。将float
转换为uint8_t
的有效方法是什么?static_cast<uint8_t>
会起作用吗?我应该先将float
转换为int
,然后将int
转换为uint8_t
吗?
它们无效,但未定义。
在C++17中:
4.10浮动积分转换[conf.fpint]
浮点类型的prvalue可以转换为整型的prvalue。转换截断;也就是说,分数部分被丢弃。如果截断的值不能在目标类型中表示,则行为是未定义的。
int
转换定义明确,不能仅仅因为结果对您有意义就假设它:
4.8积分转换[conf.Integral],第2项
如果目标类型是无符号的,则得到的值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数(。