C:处理24位2的补码的正确方法

时间:2018-12-06 07:23:22

标签: c twos-complement

我有一组32位数据的样本集,格式为 24位2的补码,MSB在前。数据精度为18位;未使用的位为零。 我想处理此样本集中的数字以找到其平均值。

但是,我不确定如何将所有数字转换为相同类型,然后使用它们来计算平均值。

一种方法是将样本集中的所有数字向右移14。这种方式我直接获得18个有用的位(因为它是18位精度的24位数据,因此仅提取18个有用的位)。 然后,我可以直接使用这些数字来计算它们的平均值。

以下是数据样本的示例样本集:-

  • 0xF9AFC000

  • 0xF9AFC000

  • 0xF9AE4000

  • 0xF9AE0000

  • 0xF9AE0000

  • 0xF9AD0000

  • 0xF9AC8000

  • 0xF9AC8000

  • 0xF9AC4000

  • 0xF9AB4000

  • 0xF9AB8000

  • 0xF9AB4000

  • 0xF9AA4000

  • 0xF9AA8000

  • 0xF9A98000

  • 0xF9A8C000

  • 0xF9A8C000

  • 0xF9A8C000

  • 0xF9A88000

  • 0xF9A84000

但是,18位数字仍然具有符号位(MSB)。不一定总是设置该位,根据数据可能为0或1。

我应该通过将所有数字与0x1FFFF进行&运算来掩盖符号位,并将其用于计算平均值吗?

还是我应该先通过取反并加1将它们从2的补码转换为整数?

请建议从32位数字中提取和处理“ 24位2的补码,MSB优先”的正确方法。

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,提供示例数据不是完整的规范,但让我们来看一下

F9AFC000

看起来数据是高位3个字节。那是个猜测。如果它们确实是2的补码的24位,那么将真实值放入32位int就是

int32_t get_value_from_datum(uint32_t datum) {
  return (int32_t) datum >> 8; 
}

在样本上,这将对前导F的高位进行符号扩展。结果将为FFF9AFC0。作为以10为底的2的补码整数,它是-413760

或者您的意思是感兴趣的18位在32位字中完全左对齐。然后是

int32_t get_value_from_datum(uint32_t datum) {
  return (int32_t) datum >> 14; 
}

结果为-6465。

正如我在评论中所说,您需要更清楚地说明数据格式。

最精确的规格最容易显示为32位字的图片,即MSB到LSB,它标识了哪18位是数据位