[英]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.