将浮点数强制转换为无符号字符是否是有效的转换?

5

请问有人能解释一下 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,它会输出!,这正是我所期望的。但是,floatuint8_t的转换根本行不通。当我尝试将输出强制转换为int时,它会给出常数255

我有一个vector<float>,想将其转换为vector<uint8_t>,并传递给一个函数。什么是将float转换为uint8_t的有效方法?static_cast<uint8_t>可以吗? 我应该先将float转换为int,然后再将int转换为uint8_t吗?


你不是在进行类型转换,而是在初始化数值。 - Pepijn Kramer
这与类型转换无关,这仅涉及std::cout如何处理char类型。 - phuclv
这个回答解决了你的问题吗?uint8_t无法使用cout打印 - phuclv
@phuclv 不是的。我已经更新了我的问题。我正在尝试将一个 float 向量转换为 uint8_t - Anonymous
1个回答

5

它们不是有效的,但是未定义。

在 C++17 中:

4.10 浮点-整数转换 [conv.fpint]

浮点类型的 prvalue 可以转换为整数类型的 prvalue。转换将截断小数部分。如果被截取的值不能表示目标类型,则其行为未定义。

int 转换是明确定义的,您不能仅因为结果对您有意义而假定它是明确定义的:

4.8 整数转换 [conv.integral],2

如果目标类型是无符号的,则得到的值是与源整数同余的最小无符号整数(模数为使用无符号类型表示时使用的位数)。


1
完成:第一个是被明确定义的,因为从有符号整数类型到无符号整数类型的转换被指定为按照 2^n_bits 取模运行。 - Matteo Italia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接