如果U08
和U16
分别是 8 位和 16 位宽的无符号整数类型,则正确的转换方法取决于缓冲区中的确切数据格式。
首先,即使缓冲区中的数据布局完全正确,简单的强制转换也可能不是正确的解决方案。除非您的U08
缓冲区最初是一个U16*
缓冲区并且被强制转换到U08*
沿线的某个位置,否则您可能会因不适当的强制转换而遇到对齐问题,要么崩溃,要么只是性能不佳。如果是这种情况,那么解决方案是首先摆脱该演员U08*
阵容,而不是添加一个额外的演员回U16*
.
如果缓冲区中的数据布局U08
对于您想要的缓冲区是正确的,那么如果可能的话,您应该创建一个缓冲区来开始,U16
而不是创建一个缓冲区。如果填充缓冲区的代码无法更改为使用缓冲区,那么这可能是可以接受强制转换的罕见情况之一;创建一个缓冲区,转换为填充它,然后您可以将缓冲区传递给您的函数而无需修改。U08
U16
U08
U16
U16
U08*
U16
如果您一开始不负责创建缓冲区,那么您可能需要创建自己的U16
缓冲区,将数据从U08
缓冲区复制到U16
缓冲区(使用 std::memcpy 或类似方法),然后将该U16
缓冲区与FunctionA
.
其次,如果U08
缓冲区中的数据布局与预期U16
缓冲区中的数据布局不同,那么您必须创建自己的U16
缓冲区并转换U08
数据。
此外,您显示的错误并未描述实际问题;它只是说您已将编译器配置为将警告视为错误并且有一些警告。这是一件好事,但您需要查看警告以确定您需要修复什么以使警告消失。
警告 C4244:“参数”:从“U32”转换为“U16”,可能丢失数据
据我所知,此警告与您显示的代码无关。你很幸运,你得到了一个警告,阻止你显示的代码静默编译,即使它可能是错误的。这就是演员阵容是一个非常糟糕的主意的原因之一。他们可以消除严重错误并隐藏错误。除非您真的知道自己在做什么,否则您不应该使用强制转换,甚至可能很少使用。
上面的警告抱怨一些代码U32
正在为一个U16
对象分配一个值。例如:
U32 a = 1000000;
U16 b = a;
由于U32
具有比 更多的有效值U16
,因此并非所有这些U32
值都可以转换为U16
. U32
无法表示的值的转换U16
可能会产生意想不到的结果。因此,您要么需要避免转换,要么确保您已经考虑了那些意外发生的情况。