当一个为负数时,如何将两个16位值组合为一个32位值?

我在堆栈溢出中发现了几个线程,这些线程演示了当两个操作数均为正数时如何将两个16位值组合为一个32位值,但是我发现如果两个操作数均为负数时它们将不起作用。

这是我目前正在使用的东西:

uint32_t combined(uint16_t low,uint16_t high)
{
  return (static_cast<uint32_t>(high) << 16) + static_cast<uint32_t>(low);
}

仅当highlow为正数时,此函数才返回正确的值。当一个或两个参数均为负数时,如何修改此函数以返回正确的结果?

deipfqu850726 回答:当一个为负数时,如何将两个16位值组合为一个32位值?

这是否满足您的要求:

uint32_t combined(uint16_t low,uint16_t high) {
    return (static_cast<uint32_t>(high) << 16) | ((static_cast<uint32_t>(low)) & 0xFFFF);
}

据我了解,将负数转换为int后的前导1会造成问题。可以通过... & 0xFFFF删除它们。

&是位and操作。 0xFFFF0x0000FFFF相同,但更短,a & 0xFFFF的意思是“使a的第一个(高)16位为0,其余部分保持不变”。

,

事实证明,OP中的逻辑很好,但是根据我的输入,我选择使用的数据类型不正确(我在slava的第一次回复后才意识到这一点)。下面是更新的功能:

int32_t combined(int16_t low,int16_t high)
{
  return (static_cast<uint32_t>(high) << 16) + static_cast<uint32_t>(low);
}

现在可以正常工作了。

本文链接:https://www.f2er.com/3021124.html

大家都在问