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。
正如我在评论中所说,你需要更清楚地解释数据格式。
精确的规格最容易显示为 32 位字的图片,MSB 到 LSB,它标识哪 18 位是数据位。
我有一个 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。
正如我在评论中所说,你需要更清楚地解释数据格式。
精确的规格最容易显示为 32 位字的图片,MSB 到 LSB,它标识哪 18 位是数据位。