将 float 转换为 unsigned char 是有效的转换吗?

Ano*_*ous 5 c++ floating-point casting char

有人可以解释一下如何float铸造uint32_t作品吗?这是有效的转换吗?

\n

下面代码中第一行的输出对我来说有意义,但其余的我自己无法弄清楚。

\n
cout<<uint8_t(256+33)<<'\\n';\ncout<<uint8_t(float(256+33))<<'\\n';\ncout<<int(uint8_t(float(256+33)))<<'\\n';\ncout<<int(uint8_t(float(256+3)))<<'\\n';\ncout<<int(uint8_t(float(256+20)))<<'\\n';\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
!\n\xef\xbf\xbd\n255\n255\n255\n
Run Code Online (Sandbox Code Playgroud)\n

uint8_t(256+33)是 int 到 unsigned char,它给出!,这正是我所期望的。然而,float根本uint8_t不起作用。当我尝试将输出转换为 int 时,它给了我常量 number 255

\n

我有一个vector<float>并想将其转换为vector<uint8_t>,它将传递到一个函数中。float转换为什么是有效的方法uint8_t?会static_cast<uint8_t>起作用吗?我应该先转换floatint然后再转换intuint8_t吗?

\n

mol*_*ilo 5

它们无效,但未定义。

在 C++17 中:

4.10 浮点积分转换 [conv.fpint]

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

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

4.8 积分转换 [conv.integral],第 2 项

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2 n,其中 n 是用于表示无符号类型的位数)。