繁体   English   中英

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

[英]C: Correct way to process 24-bit 2's complement number

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

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

一种方法是将样本集中的所有数字向右移14。这样一来,我直接获得18个有用位(因为它是24位数据,精度为18位,因此仅提取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优先 ”数字的正确方法。

提前致谢!

好吧,提供样本数据并不是一个完整的规范,但让我们来看一下

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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM