将float转换为unsigned char是否有效



有人能解释一下floatuint32_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,它给出了!,这正是我所期望的。然而,floatuint8_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是用于表示无符号类型的位数(。

相关内容

  • 没有找到相关文章

最新更新