0

我正在读取一个 24 位值,目前是一个uint32_t变量。

在将我的头撞到墙上计算两个这样的变量之间的差异并思考“它是无符号的!为什么这个溢出是个问题?!”之后,我意识到这些值溢出了包含它们的变量的大小。

这是一个计数器,因此已知一个比另一个“大”,尽管可能已经溢出。

因此,0x1 - 0x2 = 0xFFFFFFFF,但应该是0x00FFFFFF

我应该如何最好地处理这个问题?

  • 定义一个类型uint24
  • if/else在进行适当的算术运算之前较大;
  • 还有什么我没有想到的?

“最佳”应解释为“最佳实践”/“最易读”/“最安全”。

4

2 回答 2

6

要减去(或添加)两个数字并让结果环绕一个无符号 24 位数字的范围,请使用 对结果进行二进制与0xFFFFFF,即(x-y) & 0xFFFFFF. 例如:

(0x1 - 0x2) & 0xFFFFFF == 0xFFFFFF
于 2014-07-24T13:10:31.890 回答
1

首先,您可以使用比较运算符!===>>=和。如果你想比较,你不需要这样做......<<=num1 - num2

无论如何,如果真的需要,只需使用按位与

uint32_t n1 = 1, n2 = 5;
printf("0x%08x", (n1 - n2) & 0x00ffffff);

(活生生的例子)

输出:

0x00fffffc

如您所知,0xfffffc表示-424 位有符号整数。

(请注意, C 标准指定 2 的补码;我的代码可能无法在非 2 的补码系统中工作。)

于 2014-07-24T13:19:16.573 回答