C++ 将U08*缓冲区转换为U16*

C++ 将U08*缓冲区转换为U16*,c++,casting,C++,Casting,我得到了U08*_缓冲区,我需要将此参数传递给函数,该函数得到U16*: 函数签名:functionU16偏移量,U16*pInbuff 试着这样称呼它:function0,U16*m->GetBuffer 得到 warning C4244: 'argument' : conversion from 'U32' to 'U16', possible loss of data error C2220: warning treated as error- no 'object' file gener

我得到了U08*_缓冲区,我需要将此参数传递给函数,该函数得到U16*:

函数签名:functionU16偏移量,U16*pInbuff

试着这样称呼它:function0,U16*m->GetBuffer

得到

warning C4244: 'argument' : conversion from 'U32' to 'U16', possible loss of data
error C2220: warning treated as error- no 'object' file generated.
您知道如何使强制转换正确吗?

如果U08和U16分别是8位和16位宽的无符号整数类型,则正确的转换方法取决于缓冲区中的确切数据格式

首先,即使缓冲区中的数据布局完全正确,简单强制转换也可能不是正确的解决方案。除非您的U08缓冲区最初是一个U16*缓冲区,并在线路的某个位置强制转换为U08*缓冲区,否则您可能会因为不适当的强制转换而遇到对齐问题,要么崩溃,要么性能差。如果是这种情况,那么解决方案是首先消除对U08*的强制转换,而不是向U16*添加额外的强制转换

如果U08缓冲区中的数据布局适合所需的U16缓冲区,则应创建U16缓冲区,而不是创建U08缓冲区(如果可能)。如果填充U08缓冲区的代码不能更改为使用U16缓冲区,则这可能是少数可接受强制转换的情况之一;创建一个U16缓冲区,强制转换为U08*以填充它,然后可以将U16缓冲区传递给函数而无需修改

如果您不负责首先创建缓冲区,则可能需要创建自己的U16缓冲区,使用std::memcpy或类似工具将数据从U08缓冲区复制到U16缓冲区,然后将该U16缓冲区与Function一起使用

其次,如果U08缓冲区中的数据布局与预期U16缓冲区中的数据布局不同,则必须创建自己的U16缓冲区并转换U08数据

而且,您显示的错误并不能描述实际问题;它只是说您已经将编译器配置为将警告视为错误,并且存在一些警告。这是一件好事,但您需要查看警告,以确定需要修复什么才能消除警告


警告C4244:“参数”:从“U32”转换为“U16”,可能会丢失数据

据我所知,此警告与您显示的代码无关。幸运的是,您收到了一条警告,阻止您显示的代码进行静默编译,即使它可能是错误的。这就是为什么演员阵容是一个非常糟糕的主意的原因之一;它们可以消除严重错误并隐藏bug。除非您真的知道自己在做什么,否则不应该使用强制类型转换,即使在那时也可能很少使用

上面的警告抱怨某些代码将U32值指定给U16对象。例如:

U32 a = 1000000;
U16 b = a;
由于U32的有效值比U16多,因此并非所有这些U32值都可以转换为U16。转换U16无法表示的U32值可能会产生意外结果。因此,您要么需要避免转换,要么确保您已经考虑了这些意外事件

FunctionA(0, (U16*)(m->GetBuffer));
这几乎可以肯定

FunctionA(0, (U16*)(m->GetBuffer()));

当然,除非getBuffer是一个名称不正确的指针而不是函数。

如果您的类型是整数,其中U08是无符号字节,U16是无符号16位字,则可以通过填充数据来解决问题。下面的代码应该填充数据,并允许您以无符号16位值数组的形式传递缓冲区

int bufferSize;  // set this value with the actual buffer size
U16 wordBuffer= new U16[bufferSize];
U16 *wordBufferIndexer = wordBuffer;
U08 *byteBufferIndexer = byteBuffer;
for (int i = 0; i < bufferSize; ++i)
{
    wordBufferIndexer = *(byteBufferIndexer++);
}

FunctionA(0, wordBuffer);

为什么您认为强制转换是解决方案?您忘记发布被视为错误的警告。这是警告:警告C4244:“参数”:从“U32”转换为“U16”,可能会丢失数据任何关于未强制转换的正确解决方案的想法?更有可能的是,它们与uint8_t和uint16_t等效。但强制转换也不是答案。这是真正的错误:警告C4244:“参数”:从“U32”转换为“U16”,可能会丢失数据