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

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

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

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

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

以下是一组示例数据样本:-

但是,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。

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

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